在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 })
所以這些查詢我猜的工作,但我的數據不會得到更新。也許我的數據被索引錯了?實際位置可以通過Mongoose API進行更新。
Woul'd你要借另一個打擊選擇是不會得罪任何人或以其他方式難堪你,當人們給簡單的解釋標題?當然這個解釋是'ObjectId(「56d8c73314fbc7e702cfb8c4」)'。哎呀,你忘了投你的弦。 –
@BlakesSeven將題目固定爲更恰當的問題。 ObjectId()只出現在我的mongo shell中。 API沒有它就會生成一個ID。我編輯了我的問題來反映這一點。 – KyleRiggen
什麼API?所有示例(以及每個錯誤和響應)都來自MongoDB外殼。在查詢中傳遞給_id的值需要是ObjectId,否則它們不匹配。這正是這裏發生的事情。只有像'mongoose'這樣的東西纔會自動爲它分配一個字符串,因爲它是模式類型,但是你沒有在貓鼬中執行任何樣本。 –