Как проверить 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.