Mongodb 排除不属于';我的集合中的js数组中的t

Mongodb 排除不属于';我的集合中的js数组中的t,mongodb,Mongodb,假设我有一个包含10000个文档的集合,如下所示: {"_id": 1, "name": "aaa"} {"_id": 1, "name": "bbb"} {"_id": 2, "name": "ccc"} ... myArray = ["name1", "name2", "name3", "name4", ... "name100"] 现在,前端用户提交一个包含100个名称的数组,如下所示: {"_id": 1, "name": "aaa"} {"_id": 1, "name": "bbb

假设我有一个包含10000个文档的集合,如下所示:

{"_id": 1, "name": "aaa"}
{"_id": 1, "name": "bbb"}
{"_id": 2, "name": "ccc"}
...
myArray = ["name1", "name2", "name3", "name4", ... "name100"]
现在,前端用户提交一个包含100个名称的数组,如下所示:

{"_id": 1, "name": "aaa"}
{"_id": 1, "name": "bbb"}
{"_id": 2, "name": "ccc"}
...
myArray = ["name1", "name2", "name3", "name4", ... "name100"]
他想知道这100个名字中哪一个不在数据库中,所以我需要返回一个新数组,其中包含这100个名字减去我的集合中可以找到的名字。我该怎么做

我正在节点中使用官方的MongoDB驱动程序(npm MongoDB)

我现在做的是首先通过db.collection.find({name:{$in:myArray}})查找数据库中的名称,然后通过javascript排除结果。但我想有更好的办法吗


谢谢

您可以使用mongodb运算符从集合中找出不属于用户指定的元素数组的所有名称:

var newArray = []    

 db.collection.find({
    name: {
        $nin: myArray
    }
}).forEach(function(doc) {
    newArray.push(doc.name)
})

你可以试试这个。。。但我不确定它是否适用于10000个文档

db.collection.aggregate([
  {
    $group: {
      _id: null,
      names: {
        $push: "$name"
      }
    }
  },
  {
    $project: {
      newArray: {
        $setDifference: [
          [
            "name1",
            "name2",
            "name3",
            "name4"
          ],
          "$names"
        ]
      }
    }
  }
])

以下是

否,OP想要的是筛选myArray,而不是筛选集合更新后的答案将返回尚未作为名称出现的名称数组。是的,根据问题中的这一行:'他想找出哪些名称尚未出现在db中,因此,我需要返回一个新数组,其中包含在我的集合中找不到的所有名称