从 js 数组中排除不在我的集合中的项目



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

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

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

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

他想知道 100 个中的哪一个还没有在数据库中,所以我需要返回一个新数组,其中包含这 100 个名称减去在我的集合中可以找到的名称。我该怎么做?

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

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

谢谢!

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

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

这是代码片段

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

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

最新更新