注意:编辑下面我直接尝试使用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" : [ ] }
答案 0 :(得分:1)
每当你使用$ lookup时,你必须在“from”字段中添加一个额外的“s”。 例如: 如果您的表名是 “寄存器” 然后你必须写 “寄存器”
注意:仅在$ lookup时
答案 1 :(得分:0)
我解决了这个问题。有两个问题。
id
实际上是ObjectID()
所以它没有正确地比较两者。Comment
不会被识别。解决方案:
创建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"
}
}