Почему эта строка удалила все в моей базе данных MongoDB? - PullRequest
2 голосов
/ 20 апреля 2011

Хорошо, поэтому я пытаюсь развернуть небольшое обновление на моем сайте. Одно обновление включает в себя запросы к полю, которое может существовать или не существовать. Это работает не так, как я хочу, поэтому я решил сделать так, чтобы поле всегда существовало в моей базе данных. Я использовал эту строку в оболочке MongoDB:

> db.entries.update({Published: null},{$set: {Published: true}},false,true);

Теперь, я не до конца понимаю, как это привело к удалению каждого объекта записи, где опубликован null. Я имею в виду, это буквально было удалено. Я попытался найти некоторые идентификаторы, и .findOne вернет для них ноль.

Как работает эта линия? Я думал, что для каждой записи, в которой значение «Опубликовано» равно нулю (не существует), потребуется значение «Публикация».

Ответы [ 5 ]

3 голосов
/ 20 апреля 2011

Читать о поведении оператора лучше, чем угадывать поведение оператора. Поиск нуля отличается от выполнения проверки на существование.

MongoDB имеет выделенный оператор $ exist:

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists

0 голосов
/ 21 апреля 2011

Обновления не удаляют документы. На самом деле, запущенное вами обновление выполняет то, что вы хотели, например, если вы хотите, чтобы y всегда имело значение:

> db.foo.insert({x:1})
> db.foo.insert({x:2})
> db.foo.insert({y:null})
> db.foo.insert({y:1})
> db.foo.update({y:null},{$set : {y:true}}, false, true)
> db.foo.find()
{ "_id" : ObjectId("4db02aabbe5a5418fb65d24c"), "y" : true }
{ "_id" : ObjectId("4db02aafbe5a5418fb65d24d"), "y" : 1 }
{ "_id" : ObjectId("4db02aa1be5a5418fb65d24a"), "x" : 1, "y" : true }
{ "_id" : ObjectId("4db02aa4be5a5418fb65d24b"), "x" : 2, "y" : true }

Должна быть другая операция, которая сделала удаление. Там может быть запись об этом в журналах (или не может ... это зависит от того, сколько времени это заняло). Из этой информации невозможно сказать, что послужило причиной удаления, но обновление здесь не является причиной.

0 голосов
/ 21 апреля 2011

Возможно, вы захотите опубликовать этот вопрос в группе пользователей MongoDB (разработчики проверяют это очень часто) на http://groups.google.com/group/mongodb-user

0 голосов
/ 21 апреля 2011

Я думал, что для каждой записи, в которой значение «Опубликовано» равно нулю (не существует), потребуется значение «Опубликовать».

ОК, так что это две разные вещи.

Опубликован ноль:

{ Published : null, post : 'blah' }

Опубликовано не существует:

{ post : 'blahblah' }
0 голосов
/ 21 апреля 2011

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

Моя завершающая команда выглядела так:

db.entries.update({Published: {$exists: false},$atomic: true},{$set:{"Published":true}},false,true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...