#mongodb
#mongodb
Вопрос:
Я использую версию оболочки MongoDB: 2.6.3 и пытаюсь переименовать поле из оболочки.
Вот точная команда:
db.deals.update({},{$rename:{'deal':'object'}},{multi:true})
Он возвращает:
WriteResult({ "nMatched" : 18, "nUpserted" : 0, "nModified" : 0 })
Это выглядит нормально, но на самом деле структура коллекции остается неизменной после команды.
Комментарии:
1. Похоже, что нет полей с именем «сделка». Возможно, это встроено в вложенный документ или массив?
2. @NeilLunn но
"nMatched" : 18
в результате получается иначе. Один и тот же результат возвращается каждый раз, когда я выполняю команду.3. @NeilLunn, да, извините, «nMatched» для первой части-
{}
4. nMatched просто означает, что да. Ваше поле не существует или, по крайней мере, не на этом уровне. Ваш документ, добавленный к вашему вопросу, должен прояснить это, но на самом деле это кажется простой ошибкой.
Ответ №1:
Я предполагаю, что вы пытаетесь выполнить $rename
несколько раз. Пустой запрос для сопоставления {}
— первый параметр для обновления будет соответствовать всем документам в коллекции (причина, по которой вы получаете nMatched=18
). Однако вы получаете nModified:0
, потому что не было документов, в которых вызывалось поле deal
. Смотрите пример ниже:
> db.deals.remove({})
WriteResult({ "nRemoved" : 1 })
> db.deals.insert({"deal":"test"})
WriteResult({ "nInserted" : 1 })
> db.deals.find()
{ "_id" : ObjectId("53abfc1277e9b67082836948"), "deal" : "test" }
> db.deals.update({},{$rename:{'deal':'object'}},{multi:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.deals.find()
{ "_id" : ObjectId("53abfc1277e9b67082836948"), "object" : "test" }
>
Вы можете легко проверить, есть ли у вас какие-либо документы, содержащие deal
:
db.deals.find({'deal':{$exists:true}})
Комментарии:
1.
$exists
Проверка здесь на самом деле не будет иметь никакого значения. Очевидная проблема заключается в том, что поле вообще не существует нигде на корневом уровне. Если это не так, то оператор ничего не делает. Как уже выяснил постер.2. @NeilLunn вы, конечно, правы, я отредактировал ответ.
3. Я просто предупреждаю вас, что, несмотря на тех людей, которые проголосовали, это на самом деле не ответ. Проблема в том, что документ просто не содержит поля, запрашиваемого по этому пути в
$rename
операции. Я бы не стал рассчитывать на то, что эти голоса будут висеть вечно. Но опять же, вопрос в основном просто опечатка и недоразумение.4. Да, @NeilLunn, это была опечатка. Я пытался удалить вопрос, но это мне не позволяет. Вот почему я пометил это для внимания модератора.