【问题标题】:How to MongoDB aggregation in Node.js如何在 Node.js 中进行 MongoDB 聚合
【发布时间】:2020-03-13 20:17:01
【问题描述】:
var mongoose = require('mongoose');
var membersModel = require('./model_member.js');
exports.request_friend_list = function(req, res){
var userid=req.body.userid;
console.log(userid);

//  membersModel.find({_id: userid,friends:{status:0}},{_id:0,'friends':1,},function(err,data)
    membersModel.aggregate(
         {$match: {_id:userid}},
         {$project: {friends: 1}},
         {$unwind: "$friends"},
         {$match: {"friends.status": 0}}
     ,function(err,data){
     if(err){
        res.json({status:"error"});
        throw err;
    }else{
        if(JSON.stringify(data).length > 0){
            console.log(JSON.stringify(data));
            res.json(data);
        }
        else{
            res.json({status: "Data is not Exist."});
            console.log("Data is not Exist.");
        }
    }   
});

membersModel.find({...}) 正常运行,但memberModel.Aggregation({...}) 不工作。这也适用于 MongoDB:

db.members.aggregate({$match:_id: ObjectId("532b4729592f81596d000001"),$project:"friends":1,$unwind:"$friends",$match:"friends.status": 0})

有什么问题?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这里可能的问题是,当您的userid 值被传递到管道时,它实际上不是正确的ObjectID 类型。这导致在初始阶段没有“匹配”。

    因此作为一个更完整的例子:

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

    然后将按预期匹配数据:

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

    所以要小心确保这是正确的类型。当在管道阶段针对_id 提到聚合方法时,聚合方法不会自动将诸如“537ec520e98bcb378e811d54”之类的字符串值包装到ObjectID 类型中,就像Mongoose 使用其他查找和更新方法一样。

    【讨论】:

    • Member.aggregate 缺少一个包含所有这些对象的数组。应该是 Member.aggregate([ {},{},{}....{} ]);
    猜你喜欢
    • 2019-05-13
    • 2022-07-09
    • 1970-01-01
    • 2020-11-13
    • 2019-05-19
    • 2020-09-15
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多