Как проверить DBRefs в коллекции MongoDB?

предполагая, что у меня есть экземпляр MongoDB с 2 коллекциями -мест и человек.

типичный мест документ выглядит так:

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

и человек документ выглядит так:

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

есть ли способ проверки мест DBRef из документ человек коллекция?

2 ответов


здесь нет официального / встроенного метода для проверки действительности 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


для этого можно добавить сохраненную функцию. обратите внимание, что документация mongo препятствует использованию хранимых функций. Вы можете прочитать об этом здесь

по сути, вы создаете функцию:

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

и после создания функции вы можете использовать ее в своих предложениях where. Таким образом, вы можете написать функцию, которая проверяет наличие идентификатора в dbRef.