Неудачное $ переименование поля в mongodb

#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, это была опечатка. Я пытался удалить вопрос, но это мне не позволяет. Вот почему я пометил это для внимания модератора.