MongoDB查询子文档值未按预期工作

时间:2016-02-29 03:30:33

标签: mongodb

我有两个架构,ProfileLevelOfNeed

Profile
{
    "_id" : ObjectId("56d35960a695dfa140137fca"),
    . . .
    "levelOfNeedServiced" : ObjectId("56d35828a695dfa140137fc7")
}

Level of Need
{
    "_id" : ObjectId("56d35828a695dfa140137fc7"),
    "sortOrder" : 2,
    "description" : "Moderate Needs",
    "additionalCost" : 3,
    "__v" : 0
}

我目前有LevelOfNeed的4个文件。我需要做的是选择ProfilelevelOfNeedServiced.sortOrder值的所有>=文档。

示例:

db.getCollection('profiles').find({
    'levelOfNeedServiced.sortOrder': { $gte: 2 }
})

根据我的数据,我希望看到示例Profile,但这不会返回任何结果。我做错了什么?

更新1

以前,我正在运行MongoDB 3.0.9。我已升级到3.2.3,但我仍然得到相同的结果。根据{{​​3}},我应该能够查询嵌入的文档字段值。

更新2

聚合函数解决方案按预期工作,但由于我已经有一个LevelOfNeed对象数组,我可以使用它来使用$in运算符获取我需要的相关文档。 / p>

1 个答案:

答案 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文档。