2013-03-11 64 views
11

假設我有一個具有2個集合的MongoDB實例 - 個地方個人如何驗證MongoDB集合中的DBRefs?

典型地方文件看起來像:

{ 
    "_id": "someID" 
    "name": "Broadway Center" 
    "url": "bc.example.net" 
} 

而一個文件看起來像:

{ 
    "name": "Erin" 
    "place": DBRef("places", "someID") 
    "url": "bc.example.net/Erin" 
} 

有什麼辦法來驗證地方 DBREF的文件中的採集?

+0

只有通過手動挑選出的文件和查詢下一個收藏文件所有腦幹。 – Sammaye 2013-03-11 15:05:33

+3

稍微偏離主題,但確保您需要DBRef而不是簡單地存儲文檔ID。如果您不確定所引用的文檔在哪個邏輯數據庫中,DBRef只是一個不錯的選擇。這兩個選項都需要手動查詢引用的文檔(儘管一些更高級別的庫會爲您執行此操作)。 – 2013-03-11 15:21:10

+0

感謝您的提示; DBRefs實際上是必需的。 – noamt 2013-03-12 07:33:48

回答

10

沒有官方/內置方法來測試DBRefs的有效性,所以驗證必須手動執行。

我寫了一個小腳本 - validateDBRefs.js

var returnIdFunc = function(doc) { return doc._id; }; 

var allPlaceIds = db.places.find({}, {_id: 1}).map(returnIdFunc); 

var peopleWithInvalidRefs = db.people.find({"place.$id": {$nin: allPlaceIds}}).map(returnIdFunc); 

print("Found the following documents with invalid DBRefs"); 
var length = peopleWithInvalidRefs.length; 
for (var i = 0; i < length; i++) { 
    print(peopleWithInvalidRefs[i]); 
} 


,當與運行:

蒙戈DB_NAME validateDBRefs.js


威爾輸出:

找到下列文件無效DBREFS

513c4c25589446268f62f487

513c4c26589446268f62f48a

1

你可以爲它添加一個存儲函數。請注意,mongo文檔不鼓勵使用存儲的功能。你可以閱讀一下here

在本質上創建一個功能:

db.system.js.save(
    { 
    _id : "myAddFunction" , 
    value : function (x, y){ return x + y; } 
    } 
); 

,一旦功能創建您可以在where子句中使用它。所以你可以編寫一個函數來檢查dbRef中id的存在。

+0

感謝您的建議。因爲這是一個不會經常執行的操作,所以我只需編寫一個腳本並手動評估它。 – noamt 2013-03-12 13:08:55