将数组的开头与 mongodb 中的另一个数组匹配
Match beginning of array with another array in mongodb
假设我有一些文档具有这样的数组:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"letters": ["a","b","c","d"]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"letters": ["a","b"]
},
{
"_id": ObjectId("5a934e000102030405000002"),
"letters": ["a"]
},
{
"_id": ObjectId("5a934e000102030405000003"),
"letters": ["x","a","b"]
}
]
我想检索其 letters
数组以 n 长度数组开头的所有文档。例如:["a","b"]
所以结果是这样的:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"letters": ["a","b","c","d"]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"letters": ["a","b"]
}
]
我搜索了 mongo 文档和堆栈溢出,唯一接近的是使用 $all
运算符,但这并不是我想要的。
我认为可以通过先对数组进行切片,然后将其与查询数组进行匹配来完成,但我找不到任何东西。
查询
- 切片并取
$letters
的前 2 个
- 检查是否等于 ["a" "b"]
*这就像任何数组的通用解决方案,要使其正常工作,您可以将 2 替换为数组大小,将 ["a" "b"]
替换为您的数组
aggregate(
[{"$match": {"$expr": {"$eq": [{"$slice": ["$letters", 2]}, ["a", "b"]]}}}])
你可以简单地在匹配查询中使用数组索引,
- 检查
0
索引以获得 a
值
- 检查
1
索引以获得 b
值
db.collection.find({
"letters.0": "a",
"letters.1": "b"
})
假设我有一些文档具有这样的数组:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"letters": ["a","b","c","d"]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"letters": ["a","b"]
},
{
"_id": ObjectId("5a934e000102030405000002"),
"letters": ["a"]
},
{
"_id": ObjectId("5a934e000102030405000003"),
"letters": ["x","a","b"]
}
]
我想检索其 letters
数组以 n 长度数组开头的所有文档。例如:["a","b"]
所以结果是这样的:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"letters": ["a","b","c","d"]
},
{
"_id": ObjectId("5a934e000102030405000001"),
"letters": ["a","b"]
}
]
我搜索了 mongo 文档和堆栈溢出,唯一接近的是使用 $all
运算符,但这并不是我想要的。
我认为可以通过先对数组进行切片,然后将其与查询数组进行匹配来完成,但我找不到任何东西。
查询
- 切片并取
$letters
的前 2 个
- 检查是否等于 ["a" "b"]
*这就像任何数组的通用解决方案,要使其正常工作,您可以将 2 替换为数组大小,将 ["a" "b"]
替换为您的数组
aggregate(
[{"$match": {"$expr": {"$eq": [{"$slice": ["$letters", 2]}, ["a", "b"]]}}}])
你可以简单地在匹配查询中使用数组索引,
- 检查
0
索引以获得a
值 - 检查
1
索引以获得b
值
db.collection.find({
"letters.0": "a",
"letters.1": "b"
})