MongoDB: 找出查询数组的元素不在数据库中

MongoDB: find out query array's element not in database

是否可以找出数据库中不存在的查询数组元素?

示例:

const query = ['aaa','bbb','ccc']

数据库中的文件:

[{name:'bbb'},{name:'ccc'}]

我想查找不在数据库中的查询数组元素: return 结果应该是:

['aaa']

除了查询数组中的每个元素(或批次?)外,我找不到一些快速的方法来执行此操作

谁有更好的方法?谢谢

查询丢失的东西总是一个更昂贵的操作,而且没有“神奇”的查询可以为您完成。我推荐使用 Mongo 的 distinct 方法,像这样:

const queryArr = ['aaa', 'bbb', 'ccc'];
const allNames = await db.collection.distinct('name');
const notInDb = queryArr.filter(e => !allNames.includes(e));

但是,如果您想在 1 db 命令中执行此操作,您可以这样做:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      names: {
        "$addToSet": "$name"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        results: {
          $filter: {
            input: [
              "aaa",
              "bbb",
              "ccc"
            ],
            as: "datum",
            cond: {
              $not: {
                "$setIsSubset": [
                  [
                    "$$datum"
                  ],
                  "$names"
                ]
              }
            }
          }
        }
      }
    }
  }
])

Mongo Playground

正如您所知,这两种方法都要求您将所有名称加载到内存中,没有办法解决这个问题,如果您的数据库规模对于这些方法来说太大,您将不得不遍历查询输入并执行此操作一个一个。

const queryArr = ['aaa', 'bbb', 'ccc'];

for (let queryName of queryArr) {
    const found = await db.collection.findOne({name: queryName})
    if (!found) {
        //ding
    }
}

假设您在 name 字段上有一个索引,这应该非常有效。