Как я могу проверить DBRefs в коллекции MongoDB?
Предполагая, что у меня есть экземпляр MongoDB с двумя коллекциями - местами и людьми.
Типичный документ места выглядит так:
{
"_id": "someID"
"name": "Broadway Center"
"url": "bc.example.net"
}
И документ людей выглядит следующим образом:
{
"name": "Erin"
"place": DBRef("places", "someID")
"url": "bc.example.net/Erin"
}
Есть ли способ проверить места DBRef документа каждый в коллекции людей?
Ответы
Ответ 1
Там нет официального/встроенного метода, чтобы проверить правильность DBRefs, поэтому проверка должна выполняться вручную.
Я написал небольшой script - 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
Ответ 2
для этого вы можете добавить сохраненную функцию. обратите внимание, что в документации по mongo запрещено использование хранимых функций. Вы можете прочитать об этом здесь
По существу вы создаете функцию:
db.system.js.save(
{
_id : "myAddFunction" ,
value : function (x, y){ return x + y; }
}
);
и как только функция будет создана, вы можете использовать ее в своих предложениях. Таким образом, вы можете написать функцию, которая проверяет наличие идентификатора в dbRef.