-1

让我们假设一个集合 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
}
4

1 回答 1

1

将您的ids声明行替换为:

var ids = db.B.aggregate(
    {$unwind:"$ids"},
    {$group:{_id:0,x:{$addToSet:"$ids"}}}
).next();

实际上$unwind返回一个游标......

于 2014-07-15T08:26:19.333 回答