MongoDB发现所有不在此数组中

时间:2016-11-17 13:30:13

标签: arrays mongodb

我试图找到除少数用户之外的所有用户,例如:

// get special user IDs
var special = db.special.find({}, { _id: 1 }).toArray();

// get all users except for the special ones
var users = db.users.find({_id: {$nin: special}});

这不起作用,因为我传递给$nin的数组不是ObjectId的数组,而是{ _id: ObjectId() }的数组

第一次查询后,变量special看起来像这样:

[ { _id: ObjectId(###) }, { _id: ObjectId(###) } ]

但是第二个查询中的$nin需要这个:

[ ObjectId(###), ObjectId(###) ]

如何从第一个查询中获取数组中的ObjectId() ,以便我可以在第二个查询中使用它们?

或者,有没有更好的方法来实现我想要做的事情?

1 个答案:

答案 0 :(得分:3)

使用 cursor.map() 函数返回的 find() 方法将{ _id: ObjectId(###) }文档列表转换为< strong> ObjectId ,如下所示

var special = db.special.find({}, { _id: 1 }).map(function(doc){
    return doc._id;
});

您可以考虑的另一种方法是使用聚合框架中的 $lookup 运算符在special集合上执行“左外连接”并过滤文档新的“加入”数组字段。过滤器应匹配数组字段为空的文档。

以下示例演示了这一点:

db.users.aggregate([
    {
        "$lookup": {
            "from": "special",
            "localField": "_id",
            "foreignField": "_id",
            "as": "specialUsers" // <-- this will produce an arry of "joined" docs
        }
    },
    { "$match": { "specialUsers.0": { "$exists": false } } } // <-- match on empty array
])