2013-03-11 3 views
11

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

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

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

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

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

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

+0

только вручную, выбирая документы и запрос на следующую коллекцию документов существования. – Sammaye

+3

Немного не по теме, но убедитесь, что вам нужен DBRef, а не просто хранить идентификатор документа. DBRef - это только хороший выбор, если вы не уверены в том, в какой логической базе данных находится документ. Оба варианта требуют ручного запроса для упомянутого документа (хотя некоторые библиотеки более высокого уровня сделают это для вас). –

+0

Спасибо за подсказку; DBRefs действительно необходимы. – noamt

ответ

10

Существует нет официального/встроенного метода для проверки действительности 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]); 
} 


что при запуске с:

Монго DB_NAME validateDBRefs.js


Will выход:

Найдено следующие документы с некорректным DBRefs

513c4c25589446268f62f487

513c4c26589446268f62f48a

1

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

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

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

и после того, как функция создана, Вы можете использовать его в ИНЕКЕ. Таким образом, вы можете написать функцию, которая проверяет наличие id в dbRef.

+0

Спасибо за предложение. Поскольку это операция, которая не будет выполняться очень часто, я просто напишу сценарий и вручную оцениваю его. – noamt

 Смежные вопросы

  • Нет связанных вопросов^_^