我试图找到除少数用户之外的所有用户,例如:
// 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()
,以便我可以在第二个查询中使用它们?
或者,有没有更好的方法来实现我想要做的事情?
答案 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
])