[英]Query an array of sub-documents where a field's value is same for all elements
我需要在具有对象数组的 Mongo 数据库集合中查找元素作为元素,以便该数组中所有元素的一个字段具有相同的值。
条目具有以下格式:
{"tag":
{"tag": "val"},
"tags":
[{"foo": "val", "bar": int}, {"foo": "val", "bar": int}, {"foo": "val", "bar": int}]}
}
我是 MongoDB 的新手,但查找了一些东西,我已经阅读$and
和$all
以及$in
,但似乎没有一个能满足我的要求。
这是一个示例,包含四个文档:
{"tag1":
{"tag11": "val11"},
"tags":
[{"foo": "val", "bar": 1}, {"foo": "val", "bar": 2}, {"foo": "val3", "bar": 1}]}
}
{"tag1":
{"tag11": "val21"},
{"tags":
[{"foo": "val4", "bar": 2}, {"foo": "val6", "bar": 2}, {"foo": "val3", "bar": 2}]}
}
{"tag1":
{"tag11": "val21"},
{"tags":
[{"foo": "val4", "bar": 4}, {"foo": "val6", "bar": 2}, {"foo": "val3", "bar": 3}]}
}
{"tag1":
{"tag11": "val21"},
{"tags":
[{"foo": "val5", "bar": 2}, {"foo": "val5", "bar": 2}, {"foo": "val5", "bar": 2}]}
}
例如,我需要一个查询来查找所有tags
数组元素的bar
值为 2 的条目。 在上面的示例中,它将返回第二个和最后一个。
这将是结果:
(2)
{"tag1":
{"tag11": "val21"},
{"tags":
[{"foo": "val4", "bar": 2}, {"foo": "val6", "bar": 2}, {"foo": "val3", "bar": 2}]}
}
(4)
{"tag1":
{"tag11": "val21"},
{"tags":
[{"foo": "val5", "bar": 2}, {"foo": "val5", "bar": 2}, {"foo": "val5", "bar": 2}]}
}
(#) 用于指出索引。
您可以像这样使用 $elemMatch ...
db.collections.find({tag1.tags: {$elemMatch: {tag1.tags.bar:2}})
您可以使用聚合查询来遍历tags
数组并发现所有tags.bar
值都是相同的(对于每个文档)。
示例foobar
集合:
{ "_id" : 1, "tags" : [ { "foo" : "val4", "bar" : 2 }, { "foo" : "val6", "bar" : 2 }, { "foo" : "val3", "bar" : 2 } ] }
{ "_id" : 2, "tags" : [ { "foo" : "val2", "bar" : 3 }, { "foo" : "val3", "bar" : 2 }, { "foo" : "val4", "bar" : 2 } ] }
{ "_id" : 3, "tags" : [ { "foo" : "val2", "bar" : 2 }, { "foo" : "val3", "bar" : 2 }, { "foo" : "val4", "bar" : 9 } ] }
{ "_id" : 4, "tags" : [ { "foo" : "val2", "bar" : 4 }, { "foo" : "val3", "bar" : 4 }, { "foo" : "val4", "bar" : 4 } ] }
查询:
db.foobar.aggregate( [
{ $addFields: { firstBar: {$arrayElemAt: [ "$tags.bar", 0 ] } } },
{ $addFields: { tagBarMatch: { $map: {
input: "$tags",
as: "tagEle",
in: {
$cond: { if: { $eq: [ "$$tagEle.bar","$firstBar" ] },
then: true,
else: false
}
}
} } } },
{ $addFields: { tagBarMatch: { $allElementsTrue: [ "$tagBarMatch" ] } } },
{ $match: { tagBarMatch: true } },
{ $project: { _id: 1, tags: 1 } }
] )
Output:
{ "_id" : 1, "tags" : [ { "foo" : "val4", "bar" : 2 }, { "foo" : "val6", "bar" : 2 }, { "foo" : "val3", "bar" : 2 } ] }
{ "_id" : 4, "tags" : [ { "foo" : "val2", "bar" : 4 }, { "foo" : "val3", "bar" : 4 }, { "foo" : "val4", "bar" : 4 } ] }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.