如何构建查询关联父文档的字段到嵌入式数组文档的字段。使用MongoDB聚合运算符

时间:2013-04-17 08:02:46

标签: node.js mongodb mongodb-query

考虑名为“CityAssociation”

的集合中的以下文档
{
  "_id" : "MY_ID",
  "ThisCityID" : "001",
  "CityIDs" : [{
      "CityID" : "001",
      "CityName" : "Bangalore"
    }, {
      "CityID" : "002",
      "CityName" : "Mysore"
    }],
   "CityUserDetails": {
       "User" : "ABCD"
   }
}

现在我有User值,即在上面的情况下,我有值ABCD,并希望仅在第一级的字段ThisCityID与嵌入式数组documnet的字段匹配的城市中找到它{ {1}}。最后,我需要按如下方式进行投影(对于上述情况):

CityID

在Node.js + MongoDB本机驱动器中,我写了一个如下聚合查询,但是没有按预期工作。

{
'UserName': 'ABCD',
'HomeTown':'Bangalore'
}

任何人都可以告诉我如何通过查询来完成。

注意:在MongoDB架构中,我们没有控制权来更改它。

1 个答案:

答案 0 :(得分:2)

您可以使用$eq运算符检查第一级字段ThisCityID是否与嵌入式数组文档的字段CityID匹配。

db.city.aggregate([
   { $match : { "CityUserDetails.User" : "ABCD" }}, 
   { $unwind : "$CityIDs" },
   { $project : {
         matches : { $eq: ["$CityIDs.CityID","$ThisCityID"]},
         UserName : "$CityUserDetails.User",
         HomeTown : "$CityIDs.CityName"
    }},
   { $match : { matches : true }},
   { $project : {
         _id : 0,
         UserName : 1,
         HomeTown : 1
   }},
])

结果是:

{
    "result" : [
        {
            "UserName" : "ABCD",
            "HomeTown" : "Bangalore"
        }
    ],
    "ok" : 1
}