2013-03-11 4 views
11

2つのコレクションを持つMongoDBインスタンスがあるとします。個所です。MongoDBコレクションのDBRefをどのように検証できますか?

文書がどのように見える典型的な場所:すべての場所 DBRefを検証する方法はあり

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

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

そして文書がどのように見えます文書のコレクション?

+0

と、次の書類を発見しました。 – Sammaye

+3

トピックから少し外れていますが、単に文書IDを格納するのではなくDBRefが必要であることを確認してください。 DBRefは、その文書が参照されている論理データベースがわからない場合にのみ適しています。どちらのオプションも、参照されたドキュメントを手動で照会する必要があります(上位レベルのライブラリでも同様です)。 –

+0

チップをありがとう。 DBRefsは事実上必要です。 – noamt

答えて

10

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

モンゴDB_NAME 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]); 
} 


それ:validateDBRefs.js -

私は小さなスクリプトを書きました出力:

のみ、手動で文書を拾い出して、次のコレクションのドキュメントexistanceのために照会することで無効DBREFS

513c4c25589446268f62f487

513c4c26589446268f62f48a

1

これにストアドファンクションを追加できます。 mongoのドキュメントは、ストアドファンクションの使用を控えることに注意してください。

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

をし、機能が作成されたら、あなたはあなたのWHERE句で使用することができます:あなたはそれがhere

本質的にはあなたが関数を作成について読むことができます。したがって、dbRefにidの存在をチェックする関数を書くことができます。

+0

提案していただきありがとうございます。非常に頻繁には実行されない操作なので、スクリプトを作成して手動で評価します。 – noamt

関連する問題