如何在mongodb聚合中检查一个数组是否与另一个数组具有相同的元素

cl25kdpy  于 2023-01-30  发布在  Go
关注(0)|答案(2)|浏览(252)

我需要匹配所有文档,其中字段arr是一个对象ID数组,与给定的元素相同,无论位置如何。
我试过:

[
  {
    $match:{
      arr: givenArr
    }
  }
]

[
  {
    $match:{
      arr: {
          $in: givenArr
        }
    }
  }
]

第一个管道匹配在same position中具有相同元素的所有文档。
第二个管道匹配在给定数组中至少有一个元素的所有文档。
例如,如果我有几个文档,如:

[
  {
    _id: ObjectId("639a0e4cc0f6595d90a84de4"),
    arr: [
      ObjectId("639a0e4cc0f6595d90a84de1"),
      ObjectId("639a0e4cc0f6595d90a84de2"),
      ObjectId("639a0e4cc0f6595d90a84de3"),
    ]
  },
  {
    _id: ObjectId("639a0e4cc0f6595d90a84de5"),
    arr: [
      ObjectId("639a0e4cc0f6595d90a84de7"),
      ObjectId("639a0e4cc0f6595d90a84de8"),
      ObjectId("639a0e4cc0f6595d90a84de9"),
    ]
  },
]

如果我需要匹配所有arr

[
  ObjectId("639a0e4cc0f6595d90a84de8"),
  ObjectId("639a0e4cc0f6595d90a84de9"),
  ObjectId("639a0e4cc0f6595d90a84de7"),
]

我只想拿第二份文件。
我怎么能这么做?

ni65a41a

ni65a41a1#

您可以将每个数组视为一个集合,并使用"$setEquals"

db.collection.find({
  $expr: {
    $setEquals: [
      "$arr",
      [
        ObjectId("639a0e4cc0f6595d90a84de8"),
        ObjectId("639a0e4cc0f6595d90a84de9"),
        ObjectId("639a0e4cc0f6595d90a84de7")
      ]
    ]
  }
})

mongoplayground.net上试试。

ne5o7dgx

ne5o7dgx2#

您可以比较$sortArray计算的两个数组的排序结果

db.collection.find({
  $expr: {
    $eq: [
      {
        $sortArray: {
          input: "$arr",
          sortBy: 1
        }
      },
      {
        $sortArray: {
          input: [
            ObjectId("639a0e4cc0f6595d90a84de8"),
            ObjectId("639a0e4cc0f6595d90a84de9"),
            ObjectId("639a0e4cc0f6595d90a84de7"),
            
          ],
          sortBy: 1
        }
      }
    ]
  }
})

Mongo Playground

相关问题