Код, созданный в Mongoose для обновления вложенного документа, не работал. Поэтому я попытался обновить вложенный документ в Mongo Shell.
Это документ (местоположение) и вложенный документ (обзор):
{
"_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
}
Вот некоторые из моих попыток обновить вложенный документ:
В этом вопросе задан следующий формат:
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 использовала этот формат:
db.locations.update(
{
_id: "56d8c73314fbc7e702cfb8c4",
review: { $elemMatch: { author: "kyle riggen1" } }
},
{ $set: { "location.$.rating" : 1 } }
)
Это возвращает действительное обновление, но на самом деле обновление не произошло, как показано:
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
В этом вопросе использовался следующий формат:
db.locations.update({
_id: "56d8c73314fbc7e702cfb8c4",
'review.author': 'kyle riggen1'
},
{ $set: { 'review.$.rating': 1 }}
)
Это возвращает то же самое, что и документация MongoDB, как показано здесь:
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
Итак, эти запросы, я думаю, работают, но мои данные не обновляются. Возможно, мои данные будут проиндексированы неправильно? Фактическое местоположение может быть обновлено даже через API Mongoose.
ObjectId("56d8c73314fbc7e702cfb8c4")
. Ой, вы забыли бросить свою строку. - person Blakes Seven   schedule 04.03.2016_id
в запросе, должны бытьObjectId
, иначе они не будут совпадать. Это именно то, что происходит здесь. Только что-то вродеmongoose
будет автоматически отображать строку как тип схемы для вас, но вы не выполняете ни один из своих образцов в мангусте. - person Blakes Seven   schedule 04.03.2016ObjectId
является довольно простой ошибкой, и уже зачислено на ответы и вопросы, представленные много лет назад. В следующий раз обратите внимание. - person Blakes Seven   schedule 04.03.2016