2014-01-19 3 views
2

У меня есть две коллекции в Монго:Как удалить документы со сломанной ссылкой в ​​MongoDB?

db.user.find(): 
{ 
    "_id": { "$oid" : "52db05e6a2cb2f36afd63c47" }, 
    "name": "John", 
    "authority_id": { "$oid" : "52daf174a2cb2f62aed63af3" }, 
} 
{ 
    "_id": { "$oid" : "52db05e6a2cb2f36afd63d00" }, 
    "name": "Joe", 
    "authority_id": { "$oid" : "52daf174a2cb2f62aed63af3" }, 
} 

и

db.authority.find(): 
{ 
    "_id": { "$oid" : "52daf174a2cb2f62aed63af3" }, 
    "name": "Sample Authority" 
} 

магазин пользователя ссылку на ID органа через ObjectId.

Теперь моя проблема: несколько органов были удалены и больше не находятся в коллекции. Мне нужно найти способ, как выполнить итерацию через коллекцию «user» и удалить их, если их полномочия_ид указывают на удаленные полномочия.

Я попытался это:

db.user.find(
    { 
     $where: function() { 
     db.authority.find({ _id: this.authority_id }).count() == 0 
     } 
    }) 

но "дб" не доступен здесь. Возможно ли реализовать контрольную проверку внутри итерации?

+0

Могу ли я использовать $ нин и переменная эмулировать: 'удалить из пользователей, где не authority_id в (выберите идентификатор из власти)' – romaninsh

ответ

0

«$ где выражения оператора не могут получить доступ к некоторым глобальным функциям или свойствам, таким как db, которые доступны в оболочке mongo» в соответствии с http://docs.mongodb.org/manual/reference/operator/query/where/.

Но вы можете попробовать карты уменьшить: http://cookbook.mongodb.org/patterns/pivot/

Я бы просто сделать это в коде лично, но вы можете иметь различные требования.

+0

может отображать уменьшить удаление записей? In-code в порядке, но должен находиться на сервере, в java-скрипте. – romaninsh

+0

Я не думаю, что это может изменить любые данные, поскольку это только агрегация, но она может выводить результаты в коллекцию. По-прежнему выполняется другой внешний процесс для обработки вывода. Это отстой немного :) –

+0

Ну, вы могли бы использовать трюк для вывода результатов своей работы по сокращению карты в качестве окончательных версий обновленных документов в тот же набор, эффективно заменяющий их. После этого вы можете $ unset посторонних полей. Звучит рискованно :) –

1

Вы можете удалить сломанные записи, перейдя курсор на оболочку javascript или используя любой драйвер Mongo. Следующий пример даст вам идею сделать это в оболочке javascript.

db.user.find().forEach(function(myDoc) { 
    var cursor = db.authority.find({'_id' : myDoc.authority_id}); 
    if(cursor.hasNext() == false) { 
     db.user.remove({_id : myDoc._id}); 
    } 
}); 
+0

Это похоже на то, что мне нужно. Просто нужно проверить, работает ли он. – romaninsh

+2

Пожалуйста, не делайте 'cursor.hasNext() == false'. Вместо этого используйте '! Cursor.hasNext()' или, если вам нужна строгая проверка для 'false', используйте' === 'и, возможно, сначала поставьте' false' * * так, чтобы это было понято – Darkhogg

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