11

假设我有一个 MongoDB 实例,其中包含 2 个集合 - placespeople

典型的场所文档如下所示:

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

人员文档如下所示

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

有什么方法可以验证people集合中每个文档的位置DBRef吗?

4

2 回答 2

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]);
}


运行时:

mongo DB_NAME validateDBRefs.js


将输出:

发现以下具有无效 DBRefs 的文档

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 回答