【问题标题】:MongoDB projection query, filter field in matching element of inner arrayMongoDB投影查询,内部数组匹配元素中的过滤字段
【发布时间】:2015-04-09 00:14:17
【问题描述】:

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

"_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" : [ 
        {
            "peopleId" : 1122,
            "bc" : 0,
            "status" : "live",
            "fc" : 1,
            "tc": 4,
            "rc": "yellow" 

        }, 

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用聚合来做到这一点。你需要做的是:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 嗨@yogesh,是的,但这将为数组的所有元素返回“状态”,而不仅仅是匹配的元素
      • @user1843591 我认为你应该放错了一些东西,这显示了完全匹配的结果status 结果如下{"_id" : ObjectId("55101f81e4b07caf8554b9b1"),"people" : [{"status" : "live"}]}
      • 你说得对,我很抱歉,它“看起来”像是我的尝试,但我实际上并没有尝试过。感谢您的回复,我将@juancarlos 的答案标记为正确,因为他的解决方案将返回完全匹配(所有条件),而此解决方案将为匹配“myId”的所有条目返回“空”结果: "1222222" 即使 $elemMatch 没有返回任何东西。
      猜你喜欢
      • 2023-03-04
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2021-05-10
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多