$ lookup在mongodb中没有结果

时间:2016-12-20 22:44:45

标签: javascript node.js mongodb mongoose

注意:编辑下面我直接尝试使用mongo shell和正确的集合名称,但仍然是同样的问题。

我目前正在尝试学习Node和Mongodb。我想了解如何在查询中添加一个文档与另一个文档。所有文档都指向$lookup

我设置了以下两个模型,这两个模型都完全适用于他们自己的

var BearSchema   = new Schema({
    name: String
});

module.exports = mongoose.model('Bear', BearSchema);

var CommentSchema   = new Schema({
    creator_id : { type: String, ref: 'Bear' },
    comment: String
});

module.exports = mongoose.model('Comment', CommentSchema);

我将省略其他设置细节并直接查询。

当我运行Bear.find()时,我得到了预期的结果......

    [
      {
        "_id": "585887a29b7915f437742b88",
        "name": "new bear",
        "__v": 0
      }
    ]

当我运行Comment.find()时,我得到了预期的结果......

[
  {
    "_id": "585887ae9b7915f437742b89",
    "creator_id": "584de876238179030d7d7916",
    "comment": "yoyoyo",
    "__v": 0
  },
  {
    "_id": "585887e09b7915f437742b8a",
    "creator_id": "585887a29b7915f437742b88",
    "comment": "ok lets give this a go",
    "__v": 0
  }
]

请注意,第二条评论中的creator_id与承保结果中的_id相同。

然后我跑

    Bear.aggregate([
        {
            $lookup: {
                from: "Comment",
                localField: "_id",
                foreignField: "creator_id",
                as: "comments"
            }
        }
    ], function (err, bears) {
        if (err)
            res.send(err);

        res.json(bears);
    });

并获得以下内容:

[
  {
    "_id": "585887a29b7915f437742b88",
    "name": "new bear",
    "__v": 0,
    "comments": []
  }
]

我希望会出现以下内容:

[
  {
    "_id": "585887a29b7915f437742b88",
    "name": "new bear",
    "__v": 0,
    "comments": [      
       {
         "_id": "585887e09b7915f437742b8a",
         "creator_id": "585887a29b7915f437742b88",
         "comment": "ok lets give this a go",
         "__v": 0
       }
     ]
  }
]

在这种情况下我无法理解它如何知道"Comment"指的是什么。

编辑:从documentation我可以看到from字段显示:Specifies the collection in the same database to perform the join with. The from collection cannot be sharded.

编辑2:在mongoshell中,我运行了以下查询及其结果,因为您可以看到即使使用正确的集合名称仍然会出现相同的问题,但我现在可以看到ObjectId()可能是问题。 ..

> show collections
bears
comments


> db.bears.find();
{ "_id" : ObjectId("585887a29b7915f437742b88"), "name" : "new bear", "__v" : 0 }

> db.comments.find();
{ "_id" : ObjectId("585887ae9b7915f437742b89"), "creator_id" : "584de87623817903
0d7d7916", "comment" : "yoyoyo", "__v" : 0 }
{ "_id" : ObjectId("585887e09b7915f437742b8a"), "creator_id" : "585887a29b7915f4
37742b88", "comment" : "ok lets give this a go", "__v" : 0 }


> db.bears.aggregate([ { $lookup: { from: "comments", localField: "_id", foreign
Field: "creator_id", as: "comments" } } ]);
{ "_id" : ObjectId("585887a29b7915f437742b88"), "name" : "new bear", "__v" : 0,
"comments" : [ ] }

2 个答案:

答案 0 :(得分:1)

每当你使用$ lookup时,你必须在“from”字段中添加一个额外的“s”。 例如: 如果您的表名是 “寄存器” 然后你必须写 “寄存器”

注意:仅在$ lookup时

答案 1 :(得分:0)

我解决了这个问题。有两个问题。

  1. 熊架构_ id实际上是ObjectID()所以它没有正确地比较两者。
  2. 我误解了集合名称是什么,因此Comment不会被识别。
  3. 解决方案:

    创建Comment模型时,我使用了Schema.ObjectId

    var CommentSchema   = new Schema({
        creator_id : { type: Schema.ObjectId, ref: 'Bear' },
        comment: String
    });
    

    在执行查询时,我使用了comments而不是Comment,因为这是名为Mongoose的集合。

        Bear.aggregate([
            {
                $lookup: {
                    from: "comments",
                    localField: "_id",
                    foreignField: "creator_id",
                    as: "comments"
                }
            }