我有两个架构,Profile
和LevelOfNeed
。
Profile
{
"_id" : ObjectId("56d35960a695dfa140137fca"),
. . .
"levelOfNeedServiced" : ObjectId("56d35828a695dfa140137fc7")
}
Level of Need
{
"_id" : ObjectId("56d35828a695dfa140137fc7"),
"sortOrder" : 2,
"description" : "Moderate Needs",
"additionalCost" : 3,
"__v" : 0
}
我目前有LevelOfNeed
的4个文件。我需要做的是选择Profile
为levelOfNeedServiced.sortOrder
值的所有>=
文档。
示例:
db.getCollection('profiles').find({
'levelOfNeedServiced.sortOrder': { $gte: 2 }
})
根据我的数据,我希望看到示例Profile
,但这不会返回任何结果。我做错了什么?
以前,我正在运行MongoDB 3.0.9。我已升级到3.2.3,但我仍然得到相同的结果。根据{{3}},我应该能够查询嵌入的文档字段值。
聚合函数解决方案按预期工作,但由于我已经有一个LevelOfNeed
对象数组,我可以使用它来使用$in
运算符获取我需要的相关文档。 / p>
答案 0 :(得分:2)
不幸的是,mongodb在版本3.2之前不支持连接。在版本3.2中,它提供了$lookup
聚合运算符来查找跨集合的引用文档。
您可以按如下方式使用它:
db.Profile.aggregate([
{
$lookup:{
"from":"LevelOfNeed",
"localField":"levelOfNeedServiced",
"foreignField":"_id",
"as":"joined"
}
},
{
$match:{
"joined.sortOrder":{$gte:2}
}
},
{
$project:{"levelOfNeedServiced":1,...} //include things you want to project.
}
])
您的代码:
db.getCollection('profiles').find({
'levelOfNeedServiced.sortOrder': { $gte: 2 }
})
无法正常使用,因为字段levelOfNeedServiced
被标识为包含ObjectId
的字段,而不是已解析的LevelOfNeed
文档。