.push到知道父级的_id和子名称的子博士:子博士的价值?

时间:2014-06-30 19:40:30

标签: node.js mongodb mongoose

我想通过_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"

    });

2 个答案:

答案 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.updateMongodb 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.
})