将数组的开头与 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"] 替换为您的数组

Playmongo

aggregate(
[{"$match": {"$expr": {"$eq": [{"$slice": ["$letters", 2]}, ["a", "b"]]}}}])

你可以简单地在匹配查询中使用数组索引,

  • 检查 0 索引以获得 a
  • 检查 1 索引以获得 b
db.collection.find({
  "letters.0": "a",
  "letters.1": "b"
})

Playground