jquery - 查询所有元素的字段值相同的子文档数组
问题描述
我需要在具有对象数组的 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}]}
}
(#) 用于指出索引。
解决方案
您可以使用聚合查询来遍历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 } }
] )
输出:
{ "_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 } ] }
推荐阅读
- swift - 为什么集合中图像视图的内容模式没有更改为适合方面?. 图像未显示为 200*200 单元格大小
- regex - 正则表达式不会忽略选项组
- c++ - 通过引用传递是否涉及复制地址?
- javascript - OpenLayers 6 + Angular 8:LineString(s) 未显示在矢量图层上(JS 没有错误)
- javascript - 映射 2 个对象并根据值创建对象
- sql - 简单的 MSAccess SQL UNION ALL;如何包含自动注释列值?
- swagger - 使用 Swagger 描述多范围参数
- php - Laravel 关系不返回任何内容
- javascript - 鼠标悬停和时间隐藏 div 弹出窗口
- r - 使用 biomaRt 将 Ensembl ID 转换为基因名称