给定一个id列表,查询集合中不存在哪些id的最佳方法是什么?

Given a list of ids, what's the best way to query which ids do not exist in the collection?

本文关键字:id 不存在 是什么 方法 最佳 集合 查询 列表 一个      更新时间:2023-09-26

我有一个包含唯一id字段的文档集合。现在我有一个id列表,其中可能包含集合中不存在的一些id。从列表中找出这些id的最佳方法是什么?

我知道我可以使用$in操作符来获取包含在列表中的id的文档,然后与给定的id列表进行比较,但是有更好的方法来做到这一点吗?

我想你的收藏中有下列文件:

{ "_id" : ObjectId("55b725fd7279ca22edb618bb"), "id" : 1 }
{ "_id" : ObjectId("55b725fd7279ca22edb618bc"), "id" : 2 }
{ "_id" : ObjectId("55b725fd7279ca22edb618bd"), "id" : 3 }
{ "_id" : ObjectId("55b725fd7279ca22edb618be"), "id" : 4 }
{ "_id" : ObjectId("55b725fd7279ca22edb618bf"), "id" : 5 }
{ "_id" : ObjectId("55b725fd7279ca22edb618c0"), "id" : 6 }

和以下id

列表
var listId = [ 1, 3, 7, 9, 8, 35 ];

我们可以使用 .filter 方法返回不在集合中的ids数组。

var result = listId.filter(function(el){
    return db.collection.distinct('id').indexOf(el) == -1; });

这个收益率

[ 7, 9, 8, 35 ] 

现在您还可以使用聚合框架$setDifference操作符。

db.collection.aggregate([
   { "$group": { "_id": null, "ids": { "$addToSet": "$id" }}}, 
   { "$project" : { "missingIds": { "$setDifference": [ listId, "$ids" ]}, "_id": 0 }}
])

这个收益率:

{ "missingIds" : [ 7, 9, 8, 35 ] }

不幸的是,MongoDB只能使用内置函数(否则我建议使用set),但你可以尝试在列表中找到所有不同的id,然后手动将它们拉出来。

类似于(未经测试):

var your_unique_ids = ["present", "not_present"];
var present_ids = db.getCollection('your_col').distinct('unique_field', {unique_field: {$in: your_unique_ids}});
for (var i=0; i < your_unique_ids.length; i++) {
    var some_id = your_unique_ids[i];
    if (present_ids.indexOf(some_id) < 0) {
        print(some_id);
    }
}

查询结果如下:

var listid = [1,2,3,4];
db.collection.aggregate([
 {$project: { uniqueId : 
   {
    "$setDifference": 
        [ listid , db.collection.distinct( "unique_field" )]} , _id : 0 }
   }, 
 {$limit:1}
]);