检索每个文档的数组的第二个元素 - MongoDB
Posted
技术标签:
【中文标题】检索每个文档的数组的第二个元素 - MongoDB【英文标题】:Retrieve the second element of array for each document - MongoDB 【发布时间】:2016-06-28 02:22:33 【问题描述】:我有一个名为 bios
的 MongoDB 集合,其中包含与以下类似的文档:
"_id" : ObjectId("51df07b094c6acd67e492f41"),
"name" :
"first" : "John",
"last" : "McCarthy"
,
"birth" : ISODate("1927-09-04T04:00:00Z"),
"death" : ISODate("2011-12-24T05:00:00Z"),
"contribs" : [
"Lisp",
"Artificial Intelligence",
"ALGOL"
]
,
"_id" : 3,
"name" :
"first" : "Grace",
"last" : "Hopper"
,
"title" : "Rear Admiral",
"birth" : ISODate("1906-12-09T05:00:00Z"),
"death" : ISODate("1992-01-01T05:00:00Z"),
"contribs" : [
"UNIVAC",
"compiler",
"FLOW-MATIC",
"COBOL"
]
我的目标是为bios
集合中的每个文档检索数组 contribs 的第二个元素。
使用新的聚合管道运算符 $filter 我运行以下查询:
> db.bios.aggregate([
$match: "contribs.2":"$exists":1,
$project:contribs:
$filter:input:"$contribs", as: "contribs", cond:,_id:0])
根据我的查询,输出是:
"contribs" : [ "Lisp", "Artificial Intelligence", "ALGOL" ]
"contribs" : [ "UNIVAC", "compiler", "FLOW-MATIC", "COBOL" ]
这不仅仅是数组contribs
的第二个元素,而是contribs
数组的第二个元素存在时的投影。
【问题讨论】:
在这里使用.aggregate()
可能是矫枉过正。使用 db.bios.find( "contribs.1": "$exists": true , "contribs.$": 1 )
将返回匹配的元素。返回的"contribs"
仍然是一个数组,但它只是一个元素,因此很容易在代码中引用。 $arrayElemAt
运算符将作为单个值返回,但除非您在该结果之后继续聚合管道,否则它应该没有必要。也不是最高效的方法。
【参考方案1】:
你尝试过 $elementAt 吗?
db.bios.aggregate([
$match: "contribs.1": "$exists": 1 ,
$project: contribs: $arrayElemAt: [ "$contribs", 1 ]
]);
【讨论】:
以上是关于检索每个文档的数组的第二个元素 - MongoDB的主要内容,如果未能解决你的问题,请参考以下文章