11

場所の2つのコレクションを持つMongoDBインスタンスがあると仮定します。

典型的な場所のドキュメントは次のようになります。

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

そして、人々のドキュメントは次のようになります。

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

ピープルコレクション内のすべてのドキュメントの場所DBRefを検証する方法はありますか?

4

2 に答える 2

10

DBRefの有効性をテストするための公式/組み込みのメソッドがないため、検証は手動で実行する必要があります。

私は小さなスクリプトを書きました-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]);
}


それを実行すると:

mongo DB_NAME validateDBRefs.js


出力します:

無効なDBRefを持つ次のドキュメントが見つかりました

513c4c25589446268f62f487

513c4c26589446268f62f48a

于 2013-03-12T13:07:34.850 に答える
1

そのためのストアド関数を追加できます。mongoのドキュメントでは、保存されている関数の使用を推奨していないことに注意してください。あなたはそれについてここで読むことができます

基本的に、関数を作成します。

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

関数が作成されると、where句でそれを使用できます。したがって、dbRefにidが存在するかどうかをチェックする関数を作成できます。

于 2013-03-12T12:53:12.080 に答える