Как я могу проверить DBRef в коллекции 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.