我想通过_id ...
查找父级,将更新推送到嵌入式文档我正在寻找像这样的东西的正确语法,其中父元素由_id找到,子文档由用户名字段找到:
Models.Message.findById(req.params.message_id, { "to.username": "username1" } ).exec(function (err, message) {
http://mongoosejs.com/docs/subdocs.html提及"每个文档都有一个_id。 DocumentArrays有一个特殊的id方法,用于通过_id查找文档。" ,但没有提到有关通过名称查找子文档的任何内容:value
.. .find调用之后是:
message.to.push({
read :
{
marked : req.body.markedRead,
datetime : req.body.datetimeRead
},
updated : req.body.nowDatetime
}); // .push where "to.username": "username1" in UserMessageSchema [array]
// save the message, and check for errors
message.save(function(err) {
if (err)
res.send(err);
res.json({ message: 'Message "' + req.params.message_id + '" MarkedRead for: username1' });
});
}); // findByID of Message
这是db记录:
{
"_id" : ObjectId("53b185a687942abdfc234e2a"),
"created" : ISODate("2014-06-30T15:43:34Z"),
"message" : "Here's a Message",
"to" : [
{
"user" : ObjectId("53aada6f8b10eb0000ec8a90"),
"username" : "username1",
"updated" : ISODate("2014-06-30T15:43:34Z"),
"_id" : ObjectId("53b185a687942abdfc234e2b"),
"read" : {
"marked" : false
}
},
],
"__v" : 0
}
这是正确的代码集,感谢@ NielLunn的回答:
Models.Message.findOneAndUpdate(
{ "_id": req.params.message_id, "to.username": "username1" },
{
"$set": {
"to.$.read.marked": req.body.markedRead,
"to.$.read.datetime": req.body.datetimeRead,
"to.$.updated": req.body.datetimeRead
}
}, // $set (change existing): to.$.. ($ identifies the matching index of the array to update, based on the query)
function (err, message) {
if (err)
res.send(err);
res.json({ message: 'Message "' + req.params.message_id + '" MarkedRead for: username1' });
}
); // findOneAndUpdate "to.username": "username1"
});
答案 0 :(得分:1)
你可以使用.findOne()
来接受完整的查询,而不仅仅是_id
.findById()
本质上是帮助者的主要.findOneAndUpdate()][2]
值。但实际上,由于您似乎不需要任何其他验证触发器,因此您只需发出[.save()
而不是检索并使用Message.findOneAndUpdate(
{ "_id": req.params.message_id, "to.username": "username1" },
{
"$set": {
"to.$.read.marked": false,
"to.$.read.datetime": req.body.datetimeRead
"to.$.updated": req.body.nowDatetime
}
},
function(err,message) {
// contains the updated message document
}
);
:
{{1}}
由于您没有添加其他数组,因此使用$set
,您只需更改现有数据。
此处不是positional $
运算符,它根据您发出的查询标识要更新的数组的匹配索引。
答案 1 :(得分:0)
使用Model.update加Mongodb Positional Operator
var query = {
_id: req.params.message_id,
"to.username": "username1"
}
var update_query ={
$set:{
"to.$.read":{
marked : req.body.markedRead,
datetime : req.body.datetimeRead
},
"to.$.updated" : req.body.nowDatetime
}
}
Models.Message.update(query, update_query).exec(function (err, numAffected) {
//Here you should check that err is null and numAffected is 1.
})