2014-07-14 31 views
-1

假設集合的具有下列結構的文件:使用集合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 
} 
+1

您直觀的方法聽起來很正確。你可以編輯你的問題,包括你的代碼,並描述什麼不起作用嗎? – JohnnyHK

+0

@JohnnyHK:你去哪裏 – Raffael

回答

1

替換爲您ids報關行:

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

其實$unwind返回遊標...

+0

whar的區別?點? :-) – Raffael

+0

橫向滾動:我添加了一個'next()'! – dgiugg

+0

糟糕...平板電腦,對不起 – Raffael