让我们假设一个集合 A 具有以下结构的文档:
{_id: N}
N为正整数
第二个集合 B 包含以下类型的文档:
{_id: M, ids: [n1,n2,...]}
其中 n1,n2,... 为正整数
B 中的文档有效地定义了集合 A 中的文档集。
这意味着集合 A 中有两种类型的文档:
- _id 值包含在集合 B 中文档的至少一个 ids-array 中的文档
- 以及 _id 不包含在集合 B 中文档的任何 ids-array 中的那些
现在我不知道如何使用 MongoDB shell 表达式完成以下任务:
我想从集合 A 中删除不包含在集合 B 中文档的任何 ids-array 中的所有文档。
我直观的方法是将所有 ids-arrays 转换为带有聚合的集合,然后使用这个新数组在 remove-method 中组合查询 - 但这似乎不起作用。
我尝试了很多东西 - 这是一个:
> db.A.find()
{ "_id" : 1 }
{ "_id" : 2 }
{ "_id" : 3 }
{ "_id" : 4 }
{ "_id" : 5 }
{ "_id" : 6 }
{ "_id" : 7 }
{ "_id" : 8 }
> db.B.find()
{ "_id" : ObjectId("53c4c9ae55cdc092a772cb15"), "ids" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("53c4c9b855cdc092a772cb16"), "ids" : [ 3, 4, 5 ] }
> var ids = db.B.aggregate({$unwind:"$ids"},{$group:{_id:0,x:{$addToSet:"$ids"}}})
{ "_id" : 0, "x" : [ 5, 4, 3, 2, 1 ] }
> ids
{ "_id" : 0, "x" : [ 5, 4, 3, 2, 1 ] }
> db.A.find({_id:{$nin:ids.x}})
error: {
"$err" : "Can't canonicalize query: BadValue $nin needs an array",
"code" : 17287
}