Подтвердить что ты не робот

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

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

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

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

И документ людей выглядит следующим образом:

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

Есть ли способ проверить места DBRef документа каждый в коллекции людей?

4b9b3361

Ответ 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.