2016-03-04 3 views
-1

Код, созданный в Mongoose для обновления поддокумента, не работал. Поэтому я попытался обновить поддокумент внутри Mongo Shell.
Это документ (место нахождения) и поддокумент (обзор):Как обновить поддокумент в MongoDB?

{ 
"_id" : ObjectId("56d8c73314fbc7e702cfb8c4"), 
"name" : "Costly", 
"address" : "150, Super Street", 
"coords" : [ 
    -0.9630884, 
    51.451041 
], 
"reviews" : [ 
    { 
     "author" : "kyle riggen1", 
     "_id" : ObjectId("56d8de74cc7f953efd8455d9"), 
     "rating" : 4, 
     "timestamp" : ISODate("2015-06-01T06:00:00Z"), 
     "reviewText" : "will the ID work?" 
    } 
], 
"rating" : 0, 
"__v" : 2 

}

Вот некоторые из моих попыток обновления поддокумент:
This question gave this format:

update({ 
     _id: "56d8c73314fbc7e702cfb8c4", 
     "reviews._id": ObjectId("56d8de74cc7f953efd8455d9") 
    },{ 
     $set: {"reviews.$.rating": 1} 
    }, false, true 
); 

Это возвращенное ошибка «обновления не определена», как показано:

2016-03-03T22:52:44.445-0700 E QUERY [thread1] ReferenceError: update is not defined : 
@(shell):1:1 

который я думаю, что это потому, что команда не начала с db.locations.update()

MongoDB documentation used this format:

db.locations.update(
    { 
    _id: "56d8c73314fbc7e702cfb8c4", 
    review: { $elemMatch: { author: "kyle riggen1" } } 
    }, 
    { $set: { "location.$.rating" : 1 } } 
) 

Это возвращает действительное обновление, но обновление на самом деле не произошло, как показано ниже:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 }) 

This question used this format:

db.locations.update({ 
    _id: "56d8c73314fbc7e702cfb8c4", 
    'review.author': 'kyle riggen1' 
    }, 
    { $set: { 'review.$.rating': 1 }} 
) 

Это возвращает то же самое, как в документации MongoDB, как показано здесь:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 }) 

Таким образом, эти вопросы, я думаю, работают, но мои данные не получает обновления. Возможно ли, что мои данные будут проиндексированы неправильно? Фактическое местоположение может быть обновлено даже через API Mongoose.

+0

Woul'd вы хотели бы взять еще одну трещину при выборе названия, которое никого не собирается оскорблять или иначе смущать вас, когда люди дадут простое объяснение? И, конечно, объяснение это 'ObjectId (" 56d8c73314fbc7e702cfb8c4 ")'. Ой, ты забыл бросить свою строку. –

+0

@BlakesSeven фиксированный заголовок для более подходящего вопроса. ObjectId() появляется только в моей оболочке mongo. API создает идентификатор без него. Я отредактировал свой вопрос, чтобы отразить это. – KyleRiggen

+0

Какой API? Все ваши примеры (и каждая ошибка и ответ) исходят из оболочки MongoDB. Значения, которые вы передаете '_id' в запросе, должны быть' ObjectId', иначе они не будут совпадать. Это именно то, что происходит здесь. Только что-то вроде 'mongoose' будет автоматически загружать строку, как тип схемы для вас, но вы не выполняете какие-либо ваши образцы в мангусте. –

ответ

-1

Пожалуйста знайте db.collection.update(criteria, objNew, upsert, multi)

  1. criteria: состояние матча
  2. objNew: содержание обновление
  3. upsert: истина или ложь
    • верно: если не существует, вставить его
    • неверно: если не существует, не вставлять
  4. multi: истина или ложь
    • верно: обновить все согласованные документы
    • false: обновить только первый согласованный документ
+0

Прошу прощения, это мой первый ответ. Я не знаком с этим форумом. Я знаком с этим как можно скорее – Superman

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