【问题标题】:Retrieve field value from array of sub document从子文档数组中检索字段值
【发布时间】:2016-11-30 19:29:40
【问题描述】:

我有一些这样的文件:

{
  "hash": "14a076f9f6cecfc58339330eeb492e267f63062f6d5f669c7cdbfecf9eb4de32",
  "started_services": [],
  "deleted_files": [],
  "software": { 
      "adobe" : {
          "licenses" : [
                  { "key": "2384723",
                    "date": "26-10-2012"
                  },
                  { "key": "23888823",
                    "date": "09-11-2012"
                  }
          ]
      }
   }
}

如何只检索散列值和“键”值列表?

我做了以下,但是,如你所见,结果有我不想要的整个路径。

> db.repository.find({"$and": [{"datetime_int": {"$gte": 1451952000}},{"software.adobe.licenses.key" : { $exists : true}}]}, {hash:1, "software.adobe.licenses.key":1, _id:0}).limit(10)

{ "hash" : "a1532e0609aaf6acfa9e505e93af0bee0856a9a67398aeaa72aa6eb2fffd134e", "software" : { "adobe" : { "licenses" : [ { "key" : "2008350" }, { "key" : "2018350" }, { "key" : "2028350" }, { "key" : "2038350" }, { "key" : "2048350" }, { "key" : "2058350" }, { "key" : "2068350" }, { "key" : "2078350" }...]}}}

我想要的结果应该是这样的:

{"hash": "a1532e0609aaf6acfa9e505e93af0bee0856a9a67398aeaa72aa6eb2fffd134e",
 "key": ["2008350", "2018350", "2028350", "2038350", "2048350", "2058350", "2068350", "2078350"]
}

我该怎么做?

【问题讨论】:

  • “adobe”是动态字段吗?
  • 没有。都是静态字段。这些值已更改,以使事情看起来小而简单。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以使用聚合框架来做到这一点。

db.repository.aggregate([ 
    { "$match": { 
        "datetime_int": { "$gte": 1451952000 }, 
        "software.adobe.licenses.key" : { "$exists" : true } 
    }}, 
    { "$project": { 
        "hash": 1, 
        "key": { 
            "$map": { 
                "input": "$software.adobe.licenses", 
                "as": "soft", 
                "in": "$$soft.key"
            }
        }
    }}
])

从 MongoDB 3.2 开始可以直接投影子文档数组字段。

{ "$project": { "hash": 1, "key": "$software.adobe.licenses.key"}}

【讨论】:

  • 因为我使用的是 version = 3.2.x,所以我使用了您的其他建议并且效果很好。谢谢!
【解决方案2】:
db.key.aggregate((
{ "$match": { 
        "datetime_int": { "$gte": 1451952000 }
        }},
{"$unwind":"$software.adobe.licenses"},
{"$project":{"key":"$software.adobe.licenses.key", "hash":1, "_id":0}}
))

输出以下内容:

{ "hash" : "14a076f9f6cecfc58339330eeb492e267f63062f6d5f669c7cdbfecf9eb4de32", "key" : [ "2384723", "23888823" ] }

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2021-01-07
    • 1970-01-01
    • 2011-08-31
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多