Найти сиротского DBRef в коллекции - PullRequest
1 голос
/ 13 октября 2011

Есть ли простой способ найти потерянные ссылки в запросе? У меня есть коллекция элементов, имеющих родительскую ссылку. После того, как некоторые родители были удалены, я хотел бы искать элементы, которые указывали на них, то есть те, которые имеют висячие ссылки.

Я пробовал разные синтаксисы, но ни один не работал.

Ответы [ 3 ]

5 голосов
/ 24 июня 2013

, предполагающий:

  • родительская коллекция parentCollection,
  • детская коллекция childCollection
  • ребенок ссылается на родителя через childCollection.parentRefId,

Затем вы можете удалить все висящие дочерние объекты, введя mongo следующую команду:

db.childCollection.find().forEach(function(f) { 
    if(f.parentRefId && !db.parentCollection.findOne({ _id: f.parentRefId})) {        
        db.childCollection.remove({ parentRefId: f.parentRefId });
    }
});
0 голосов
/ 26 декабря 2016
db.childCollection.find().forEach(function(f) {
    if(f.refKey && db.parentCollection.find({ "_id": f.refKey.$id}).count() != 1) {
        db.childCollection.remove({ _id: f._id });
    }
});

это сработало очень мирно для меня ..

0 голосов
/ 13 октября 2011

Нет, нет, поскольку mongodb нереляционный, вам нужно найти все отношения самостоятельно. Все драйверы разрешают ссылки на стороне клиента, делая запрос на любую ссылку. В вашем случае вам нужно пройтись по всем категориям и попытаться загрузить родителя в случае, если родителя не существует - убрать дочернего или сделать все, что вы хотите. Dbref документация

...