arrays - 以任意顺序搜索 MongoDB 对象数组
问题描述
我有一个带有对象数组的 mongodb 集合。我希望能够以任何顺序搜索数组中的对象,并且仅在找到该数组中的所有对象时才返回匹配项。
我的收藏:
{
"_id" : ObjectId("5234c367354kj63c9cae4fec"),
"field1" : "TEST",
"created" : <DATE_HERE>,
"field2" : [
{
"index" : "A",
"value" : "1"
},
{
"index" : "B",
"value" : "2"
},
{
"index" : "C",
"value" : "3"
}
],
}
如果我提供下面的查询,上面的文档将被返回,因为所有 3 个对象都按照它们存储的确切顺序给出。
db.collection("collection").find({field1: "TEST", field2: [{"index": "A", "value": "1"}, {"index": "B", "value": "2"}, {"index": "C", "value": "3"}]})
但是,我希望能够以任意顺序找到上面给出的 3 个对象的文档。例如下面的查询:
db.collection("collection").find({field1: "TEST", field2: [{"index": "B", "value": "2"}, {"index": "A", "value": "1"}, {"index": "A", "value": "1"}]})
我知道上面的查询不会起作用,如果它甚至可能的话,并且缺少正确的语法/搜索功能,但这只是为了解释我的思考过程和我想要实现的目标。
我试过使用$in
类似的搜索field2: {$in: [<3_objects_above>]}
,但它不会给我一个精确的匹配。例如,如果此集合中有第二个文档,field2: [...{"index": "Z", "value": "543"}]
并且它仅包含上面 2 个查询和表中显示的 3 个对象中的 1 个,则该第二个文档也将被返回,因为它与数组中提供的至少 1 个对象匹配即使我没有提供对象{"index": "Z", "value": "543"}
。
有没有办法以任何顺序在数组中给出对象,并在集合中找到与所有 3 个对象匹配的文档,无论它们以什么顺序给出?匹配所有 3 而不是 3 中的任何一个?
解决方案
您可以使用$all运算符:
db.collection.find(
{
field1: "TEST",
field2: {
$all: [
{ "index": "A", "value": "1" },
{ "index": "B", "value": "2" },
{ "index": "C", "value": "3" }
]
}
}
)
推荐阅读
- flutter - Flutter GectureDetector onTap 仅适用于文本子项
- javascript - 如何以简单的方式获取当前版本中显示的 yAxis highcharts 的最后一个值?
- html - Bootstrap 导航栏图标未正确对齐
- swiftui - 可以在 SwiftUI 中使 NavigationView 标题可点击吗?
- r - 我如何将我的数据从 ymd 重塑为年?
- c# - 使用 href html 敏捷包解析表
- jfreechart - 如何在 OptaPlanner 的 UI 中调整颜色?
- regex - 长度为 3 个字符且至少一个字母的正则表达式
- java - Java:将 lambdas 存储为值的映射
- python - 提取产品标题中可衡量的指标