假設集合的具有下列結構的文件:使用集合B中的信息過濾集合A中的文檔 - 如何?
{_id: N}
,N爲正整數
而第二集合體B有以下類型的文檔:
{_id: M, ids: [n1,n2,...]}
與N1,N2, ...是一個正整數
B中的文件被有效限定了從集合A.證件套
這意味着有在集合的兩種類型的文件:
- 文檔其_id值被包含在文檔中的至少一個IDS-陣列中收集乙
- 和那些_id不包含在任何一個文檔的集合體B IDS陣列
現在我不知道怎麼去使用MongoDB的shell表達式完成以下任務:
我想刪除從集合A中的所有文件不包含在集合B中的文檔的任何IDS陣列
我直觀的方法是把所有的ID陣列成一組與骨料,然後使用這個新陣的remove-內撰寫查詢方法 - 但這似乎不起作用。
我試過許多東西 - 這裏有一個:
> 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
}
您直觀的方法聽起來很正確。你可以編輯你的問題,包括你的代碼,並描述什麼不起作用嗎? – JohnnyHK
@JohnnyHK:你去哪裏 – Raffael