问题 如何验证MongoDB集合中的DBRef?


假设我有一个包含2个集合的MongoDB实例 - 地方 和

一个典型的 地方 文档看起来像:

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

还有一个  文档看起来像:

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

有没有办法验证 地方 DBRef的 一切 文件在  采集?


7567
2018-03-11 14:54


起源

只能通过手动挑选文档并查询下一个集合文档存在。 - Sammaye
稍微偏离主题但确保您需要DBRef而不是简单地存储文档ID。如果您不确定要引用的文档在哪个逻辑数据库中,DBRef只是一个不错的选择。这两个选项都需要手动查询引用的文档(尽管一些更高级别的库会为您执行此操作)。 - Remon van Vliet
谢谢你的提示; DBRefs实际上是必需的。 - noamt


答案:


没有官方/内置方法 测试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


10
2018-03-12 13:07





你可以为它添加一个存储的函数。请注意,mongo文档不鼓励使用存储的函数。你可以阅读它 这里 

本质上,您创建一个函数:

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

一旦创建了该函数,就可以在where子句中使用它。所以你可以编写一个函数来检查dbRef中是否存在id。


1
2018-03-12 12:53



谢谢你的建议。因为它是一个不会经常执行的操作,所以我只需编写一个脚本并手动评估它。 - noamt