MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come aggregare MongoDB in Node.js

Il problema probabile qui è che il tuo userid value non è effettivamente un ObjectID corretto digitare quando viene passato alla pipeline. Ciò comporta che nulla venga "abbinato" nella fase iniziale.

Quindi come esempio più completo:

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 ) );

  }
);

Che poi corrisponderà ai dati come previsto:

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

Quindi fai attenzione per assicurarti che sia del tipo corretto. Il metodo aggregate non esegue il wrapping automaticamente di un valore stringa come "537ec520e98bcb378e811d54" in un ObjectID digitare quando viene menzionato in una fase della pipeline rispetto a _id nel modo in cui Mongoose lo fa con altri metodi di ricerca e aggiornamento.