【问题标题】:Add or push new object to nested mongodb document将新对象添加或推送到嵌套的 mongodb 文档
【发布时间】:2017-03-05 06:56:57
【问题描述】:

我似乎无法在 Stack 或 Mongoose 文档中找到答案。如何将新对象添加到嵌套文档中?

这是我当前的架构:

var SessionsSchema = mongoose.Schema({
      session: {
      sid: String,
      dataloop: {
          timeStamp: Date,
          sensorValues:{
              value: Number,
              index: Number
          }
      }
    }
});

从客户端接收到新数据后,我需要推送到现有会话文档中,我尝试了 $addToSet 和 $push 但都没有给我正确的结果。

这是 $push:

Sessions.findOneAndUpdate(
                    { 'session.sid': sessionID },
                    { 
                        '$push:': {dataloop:{
                                timeStamp: datemilli,
                                sensorValues:{
                                     value: pressure,
                                     index: indexNum,
                                     sessionTime: relativeTime
                                }
                            }
                        }
                    },
                    function(err,loop) {
                        console.log(loop);
                    }
                )

这是我的预期输出:

   _id:58bb37a7e2950617355fab0d
   session:Object
     sid:8
     dataloop:Object
        timeStamp:2017-03-04 16:54:27.057
        sensorValues:Object
          value:134
          index:18
          sessionTime:0
     dataloop:Object  // <----------NEW OBJECT ADDED HERE
        timeStamp:2017-03-04 16:54:27.059
        sensorValues:Object
          value:134
          index:18
          sessionTime:0
     dataloop:Object  // <----------ANOTHER NEW OBJECT
        timeStamp:2017-03-04 16:54:27.059
        sensorValues:Object
          value:134
          index:18
          sessionTime:0
   __v:0

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    如果您考虑更改架构以包含 dataloop 数组:

    var SessionsSchema = mongoose.Schema({
        session: {
            sid: String,
            dataloop: [{
                timeStamp: Date,
                sensorValues: {
                    value: Number,
                    index: Number
                }
            }]
        }
    });
    

    您可以在session.dataloop 上使用$push 添加新的dataloop 项目:

    Sessions.findOneAndUpdate({ 'session.sid': sessionID }, {
            '$push': {
                'session.dataloop': {
                    timeStamp: datemilli,
                    sensorValues: {
                        value: pressure,
                        index: indexNum,
                        sessionTime: relativeTime
                    }
                }
            }
        },
        function(err, loop) {
            console.log(loop);
        }
    )
    

    【讨论】:

    • 这似乎覆盖了前一个对象,我需要保留前一个对象并添加一个新对象。有意义吗?
    • 您的意思是您在session.dataloop 中还有其他字段而不是您指定的字段并且它们必须保持原样?
    • 新的字段集,但架构相同。示例:session.dataloop1、session.dataloop2、session.dataloop3
    • 为什么不将dataloop 声明为一个数组?
    • 我应该在定义架构时声明它吗?
    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2021-02-13
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多