Mongodb:项目在不使用展开的情况下返回对象数组中的字段

时间:2018-02-16 17:38:46

标签: javascript node.js mongodb mongodb-query

我需要在不使用$ unwind的情况下获得字段值 因为$ unwind和$ group需要更长的时间。

我的文件(看起来像):

{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"providers" : [ 
    {
        "list" : [ 
            {
                "code" : "ATT",
                "descr" : "Attending"
            }
        ],
        "Name" : "John Doe",
        "prvdId" : "1"
    }, 
    {
        "list" : [ 
            {
                "code" : "RFR",
                "descr" : "Referring"
            }, 
            {
                "code" : "TRT",
                "descr" : "Treating"
            }
        ],
        "Name" : "Smith William",
        "prvdId" : "2"
    }
]

}

cond is if" code" :" TRT",而不是" prvdId"

预期结果是

{"prvdId" : "2"}

2 个答案:

答案 0 :(得分:0)

$filter与$ in一起使用以查找嵌套数组中的匹配项,然后使用$let查找$arrayElemAt以在3.4中输出prvdId。

db.col.aggregate([
  {"$match":{"providers.list.code":"TRT"}},
  {"$project":{
    "_id":0,
    "prvdId":{
      "$let":{
        "vars":{
          "providersl":{
            "$filter":{
              "input":"$providers",
              "as":"providerf",
              "cond":{"$in":["TRT","$$providerf.list.code"]}
            }
          }
        },
        "in":{"$arrayElemAt":["$$providersl.prvdId",0]}
      }
    }
  }}
])

答案 1 :(得分:0)

根据上述描述作为解决方案,可以通过使用$ elemMatch运算符将数组元素搜索到查找操作中来获得预期结果。

db.collection.find({
    providers: {
        $elemMatch: {
            list: {
                $elemMatch: {
                    code: "TRT"
                }
            }
        }
    }
}, {
    'providers.$.prvdId': 1
})