MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Anleitung zur MongoDB-Aggregation in Node.js

Das wahrscheinliche Problem hier ist, dass Ihre userid value ist eigentlich keine korrekte ObjectID Typ, wenn er an die Pipeline übergeben wird. Dies führt dazu, dass in der Anfangsphase nichts "abgeglichen" wird.

Daher als vollständigeres Beispiel:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectID = require("mongodb").ObjectID;

mongoose.connect("mongodb://localhost/test");

friendSchema = new Schema({
  "name": String,
  "status": Number
});

memberSchema = new Schema({
  friends: [friendSchema]
});

var Member = mongoose.model("Members", memberSchema );

var userid = new ObjectID("537ec520e98bcb378e811d54");

console.log( userid );

Member.aggregate([
  { "$match": { "_id": userid } },
  { "$unwind": "$friends" },
  { "$match": { "friends.status": 0 } }],
  function( err, data ) {

    if ( err )
      throw err;

    console.log( JSON.stringify( data, undefined, 2 ) );

  }
);

Welche Daten dann wie erwartet übereinstimmen:

[
  {
    "_id": "537ec520e98bcb378e811d54",
    "friends": [{
      "name": "Ted",
      "status": 0
    }]
  }
]

Achten Sie also darauf, dass es sich um den richtigen Typ handelt. Die Aggregatmethode schließt einen Zeichenfolgenwert wie „537ec520e98bcb378e811d54“ nicht automatisch in eine ObjectID ein Typ, wenn er in einer Pipelinephase gegen _id erwähnt wird in der Weise, wie Mongoose dies mit anderen Such- und Aktualisierungsmethoden tut.