繁体   English   中英

查询所有元素的字段值相同的子文档数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM