【发布时间】:2016-06-17 18:36:49
【问题描述】:
在 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
}
以下是我更新子文档的一些尝试:
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 也可以更新实际位置。
【问题讨论】:
-
当人们给出简单的解释时,您是否愿意再次尝试选择一个不会冒犯任何人或以其他方式让您难堪的标题?当然,这个解释是
ObjectId("56d8c73314fbc7e702cfb8c4")。哎呀,你忘了投你的字符串。 -
@BlakesSeven 将标题固定为更合适的问题。 ObjectId() 只出现在我的 mongo shell 中。没有它,API 会生成一个 ID。我已经编辑了我的问题以反映这一点。
-
什么 API?您的所有示例(以及每个错误和响应)都是从 MongoDB shell 发出的。您在查询中传递给
_id的值必须是ObjectId,否则它们将不匹配。这正是这里发生的事情。只有像mongoose这样的东西会自动转换一个字符串,因为它是你的模式类型,但你没有在猫鼬中执行任何示例。 -
@BlakesSeven 我认为可以尝试一下
-
@BlakesSeven 成功了!您介意提交一个答案,以便我将我的愚蠢问题归功于您吗?
标签: node.js mongodb put subdocument