【问题标题】:Mongoose/MongoDB - updating a sub document is not workingMongoose/MongoDB - 更新子文档不起作用
【发布时间】:2014-06-26 02:04:18
【问题描述】:

我正在寻找这样的子文档:

var incidentId = "someID1"
var alerteeId  = "someID2"

Incident.findOneQ({ _id: someID1, 'alertees._id': someID2 }, {'alertees.$': 1})
.then(function(incident) {
  var alertee = incident.alertees[0];
  alertee.responded_at = Date.now()
  return alertee.parent().saveQ().then(function(alertee) {
    console.log(alertee)
  })
})

它正确地找到了被通知者。但是当我更新时,它无法保存警报。

仅当数组中的警报者的位置不是第一个时才会发生这种情况。可以找到并更新警报者数组中的第一个警报者。

我做错了什么?

【问题讨论】:

    标签: javascript arrays node.js mongodb mongoose


    【解决方案1】:

    您这里的语法不是“严格”的猫鼬语法,所以不确定您是否在此之上实现了其他层。

    但您真正想要的是 .findOneAndUpdate(),如 mongoose 文档中所述。基本上,这将在一次调用中完成您的全部更新,您可以这样称呼它:

    Incident.findOneAndUpdate(
        { "_id": someID1, "alertees._id": someID2 },
        { "alertees.$.responded_at": Date.now() },
        function(err,incident) {
            if (err) throw err;    // or do something like return the error
    
            if ( incident != null ) {
                incident.altertees.some(function(alertee) {
                    if ( alertee._id.toString() == someID2.toString() ) {
                        console.log( alertee );
                        return 1;
                    }
                });
            } else {
                console.log( "not found" );
            }
        }
    );
    

    这是最有效的更新表单,它还会返回更改后的文档。在响应回调中,我使用 Array#some 只是为了匹配已更新并按原样返回的“alertee”。

    当然,这不会调用在您的“模式”上定义的任何方法或挂钩,但是对于仅更新日期而言,您不太可能需要它。如果你这样做了,你可以像你一样使用.findOne() 和.save(),但是像我在更新之前那样匹配数组元素。


    或者作为一个更完整的例子:

    var async = require('async'),
        mongoose = require('mongoose'),
        Schema = mongoose.Schema,
        ObjectId = require('mongodb').ObjectID;
    
    mongoose.connect('mongodb://localhost/test');
    
    var alerteeSchema = new Schema({
        "responded_at": Date
    });
    
    var incidentSchema = Schema({
        alertees: [alerteeSchema]
    });
    
    var Incident = mongoose.model( "Incident", incidentSchema );
    
    var incident = new Incident();
    
    var date1 = new Date();
    var date2 = new Date(
        date1.valueOf() - ( date1.valueOf() % 1000 * 60 * 60 * 24 )
    );
    
    incident.alertees.push({ "responded_at": date1 });
    incident.alertees.push({ "responded_at": date2 });
    
    incident.save(function(err,incident) {
    
        if (err) throw err;
        var someID1 = incident._id;
        var someID2 = incident.alertees[1]._id;
        //var someID2 = new ObjectId();
    
        console.log( "before: \n" + incident );
    
    
        Incident.findOneAndUpdate(
            { "_id": someID1, "alertees._id": someID2 },
            { "alertees.$.responded_at": Date.now() },
            function(err,incident) {
                if (err) throw err;
    
                if (incident != null) {
                    incident.alertees.some(function(alertee) {
                        console.log( "test: " + alertee );
                        if ( alertee._id.toString() == someID2.toString() ) {
                            console.log( "after: \n" + alertee );
                            return 1;
                        }
                    });
                } else {
                    console.log( "not found" );
                }
            }
        );
    
    });
    

    有了这些结果:

    before:
    { __v: 0,
      _id: 53aba6c73b8d05ef77c2703b,
      alertees:
       [ { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
           _id: 53aba6c73b8d05ef77c2703c },
         { responded_at: Thu Jun 26 2014 08:58:31 GMT+1000 (EST),
           _id: 53aba6c73b8d05ef77c2703d } ] }
    test: { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
      _id: 53aba6c73b8d05ef77c2703c }
    test: { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
      _id: 53aba6c73b8d05ef77c2703d }
    after:
    { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
      _id: 53aba6c73b8d05ef77c2703d }
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2017-06-08
      • 2017-03-17
      • 2015-07-12
      相关资源
      最近更新 更多