2014-01-19 36 views
2

我在蒙戈兩個集合:如何在MongoDB中刪除具有破壞引用的文檔?

db.user.find(): 
{ 
    "_id": { "$oid" : "52db05e6a2cb2f36afd63c47" }, 
    "name": "John", 
    "authority_id": { "$oid" : "52daf174a2cb2f62aed63af3" }, 
} 
{ 
    "_id": { "$oid" : "52db05e6a2cb2f36afd63d00" }, 
    "name": "Joe", 
    "authority_id": { "$oid" : "52daf174a2cb2f62aed63af3" }, 
} 

db.authority.find(): 
{ 
    "_id": { "$oid" : "52daf174a2cb2f62aed63af3" }, 
    "name": "Sample Authority" 
} 

用戶存儲參考通過的ObjectId權威的ID。

現在我的問題:幾個權限已被刪除,不再在集合中。我需要找到一種方法,如果它們的authority_id指向已刪除的權限,則如何遍歷「user」集合並刪除它們。

我已經試過這樣:

db.user.find(
    { 
     $where: function() { 
     db.authority.find({ _id: this.authority_id }).count() == 0 
     } 
    }) 

但 「DB」 是無法訪問那裏。是否有可能在迭代內部實現引用檢查?

+0

我可以用$寧和可變效仿:'從用戶刪除不authority_id不在(選擇授權ID)' – romaninsh

回答

0

「$,其中運算符表達式無法訪問根據http://docs.mongodb.org/manual/reference/operator/query/where/在mongo shell中可用的某些全局函數或屬性,如db。

不過你可以試試地圖降低: http://cookbook.mongodb.org/patterns/pivot/

我只想做在代碼個人,但你可能有不同的要求。

+0

可以映射減少刪除記錄?代碼可以,但應該在服務器上,在java腳本中。 – romaninsh

+0

我不認爲它可以改變任何數據,因爲它只是一個聚合,但它可以輸出結果到一個集合。之後仍然需要另一個外部過程來處理輸出。這太吸了一點:) –

+0

那麼你可以使用一個技巧,輸出你的地圖縮小作業的結果作爲最終版本的更新文件到相同的集合有效地取代它們。之後您可以$取消設置無關字段。聽起來有風險:) –

1

您可以通過迭代javascript shell上的光標或使用任何Mongo驅動程序來刪除損壞的條目。下面的例子會給你一個在javascript shell上做的想法。

db.user.find().forEach(function(myDoc) { 
    var cursor = db.authority.find({'_id' : myDoc.authority_id}); 
    if(cursor.hasNext() == false) { 
     db.user.remove({_id : myDoc._id}); 
    } 
}); 
+0

這看起來像我所需要的。只需要檢查它是否工作。 – romaninsh

+2

請不要做'cursor.hasNext()== false'。使用'!cursor.hasNext()'代替,或者,如果你需要嚴格檢查'false',可以使用'==='並且可以先將'false' *首先*以使它更清晰 – Darkhogg

相關問題