MongoDB投影查询,过滤内部数组匹配元素中的字段

时间:2015-04-09 00:14:18

标签: mongodb mongodb-query aggregation-framework database nosql

我有一个包含数组的文档。像这样:

"_id" : ObjectId("55101f81e4b07caf8554b9b1"),
"myId" : "1222222",
"isDelayed" : false,
"status" : "BALLS",
"yellow" : false,
"white" : true,
"people" : [ 
    {
        "peopleId" : 222222,
        "bc" : 0,
        "status" : "live",
        "fc" : 1,
        "tc": 4,
        "rc": "yellow" 

    }, 
    {
        "peopleId" : 33312,
        "bc" : 0,
        "status" : "live",
        "fc" : 1,
        "tc": 4,
        "rc": "yellow" 

    }, 
  ...

我有一个如下所示的mongo查询,在集合mycoll中,如果是myId=1.222,在人员数组中,如果people.peopleId=1123它返回第一个匹配项:

db.getCollection('mycoll').find(
    {myId:'1.222',
        people: { $elemMatch: { peopleId: 1123 }
                 }
    },{"people.$": 1 }).pretty();

结果包括数组中people条目中的所有字段:

"people" : [ 
        {
            "peopleId" : 1122,
            "bc" : 0,
            "status" : "live",
            "fc" : 1,
            "tc": 4,
            "rc": "yellow" 

        }, 

如何过滤回复,它只返回内部数组中匹配条目中的所需字段,例如"status"?我可以为外部文档生成过滤器,但不能为数组元素中的字段生成过滤器。

2 个答案:

答案 0 :(得分:2)

您可以使用聚合执行此操作。你需要做的是:

  1. 将文档与所需的myId匹配。
  2. 展开people数组,以便people内的每个子文档都有一个文档。
  3. 匹配指定的peopleId
  4. 根据需要设置项目字段。
  5. db.mycoll.aggregate([
        { "$match": { "myId": "1.222"} },
        { "$unwind": "$people" },
        { "$match": { "people.peopleId": 1123 }},
        { "$project": { "peopleId": "$people.peopleId",
                        "status": "$people.status" }
        }
    ]).pretty();
    

答案 1 :(得分:1)

Mongo $elemMatch in projection用于投影,以查找您的案例status下面的特定字段,查询仅返回status字段

db.collectionName.find({"myId":"1222222"},{"people":{"$elemMatch":{"peopleId":33312}},"people.status":1}).pretty()