聚合数组中的对象与多个条件匹配的文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚合数组中的对象与多个条件匹配的文档相关的知识,希望对你有一定的参考价值。
我有一个包含类似文件的集合:
{
"_id": ObjectId("xxxxx"),
"item": [
{ "property": ["attr1", "+1"] },
{ "property": ["attr2", "-1"] }
]
}
{
"_id": ObjectId("xxxxy"),
"item": [
{ "property": ["attr1", "-1"] },
{ "property": ["attr2", "0"] }
]
}
{
"_id": ObjectId("xxxxz"),
"item": [
{ "property": ["attr1", "0"] },
{ "property": ["attr2", "+1"] }
]
}
最好使用聚合管道,当且仅当任何一个属性与多个条件匹配时,有没有办法匹配文档?
例如,我想要一个查询,其中数组中的一个对象匹配以下两个条件:
("item.property": "attr1") AND ("item.property": /^\+/)
也就是说,它包含“attr1”的单个属性和以“+”开头的元素。
但是,使用我当前的查询,如下所示:
collection.aggregate(
{ $match:
{ $and:
[
{ "item.property": "attr1" },
{ "item.property": /^\+/ }
]
}
}
这将匹配第一个和最后一个文档,因为它们都包含具有“attr1”的属性和具有“+”的统计信息的元素。但是,我不希望此查询与最后一个文档匹配,因为以“+”开头的元素不属于数组中的同一对象。
有没有办法使用聚合框架来实现这种行为?
答案
您可以使用以下查询与$elemMatch
匹配数组的两个值。
就像是
db.collection_name.aggregate({
"$match": {
"item": {
"$elemMatch": {
"property.0": "attr1",
"property.1": /^\+/
}
}
}
});
此外,如果您不想引用数组索引,则可以使用$all
运算符。
db.collection_name.aggregate({
"$match": {
"item": {
"$elemMatch": {
"property": {
"$all": [
"attr1",
/^\+/
]
}
}
}
}
});
以上是关于聚合数组中的对象与多个条件匹配的文档的主要内容,如果未能解决你的问题,请参考以下文章