从js数组中排除我的集合中没有的项目

时间:2018-06-15 16:04:36

标签: mongodb

假设我有一个包含10000个文档的集合:

{"_id": 1, "name": "aaa"}
{"_id": 1, "name": "bbb"}
{"_id": 2, "name": "ccc"}
...

现在前端用户提交一个包含100个名字的数组,如下所示:

myArray = ["name1", "name2", "name3", "name4", ... "name100"]

并且他想知道100中哪一个还没有在db中,所以我需要返回一个包含这100个名字的新数组减去可以在我的集合中找到的名字。我怎么能这样做?

我在Node(npm mongodb)中使用官方MongoDB驱动程序。

我目前所做的是首先通过db.collection.find({name:{$ in:myArray}})查找db中的名称,然后通过javascript排除结果。但我想有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以尝试这个......但我不确定它是否适用于10000个文件

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

以下是code snippet

答案 1 :(得分:0)

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

var newArray = []    

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