Mongoose - findOneAndUpdate 动态 $push 到数组中

Posted

技术标签:

【中文标题】Mongoose - findOneAndUpdate 动态 $push 到数组中【英文标题】:Mongoose - findOneAndUpdate dynamically $push into array 【发布时间】:2020-10-25 11:07:31 【问题描述】:

我正在尝试将新值动态添加到数组字段中。

最近取得了足够的进展,不必费心在这里问他们,尽管这是我认为确实应该问的一个问题!所以从这里开始是我的架构:

  var ugh = new mongoose.Schema(
    yes: String,
    bio: String,
    keys: [ 
      nickname: String,
      data1: String,
      data2: Boolean,
      data3: String,
      data4: String,
    ]
  );

  var ughhh = mongoose.model('X', ugh, 'x');

这是我试图编写的解析器:

      setSomething: async (root,  nickname, data1, data2, data3, data4 ,  userId ) => 
        if (nickname) 
        let action = await ughhh.findOneAndUpdate(
           _id: userId , 
           $set: 
             
              'keys.0.nickname': nickname, 
              'keys.0.data1': data1,
              'keys.0.data2': data2,  
              'keys.0.data3': data3,
              'keys.0.data4': data4,
            ,
          , 
          
          new: true,
          upsert: true,
        );
        action;
        
        return null;
      ,
    ,

现在我确实喜欢新设置的键的数字排序,从 0 开始。

但是当我尝试$set 另一个时,它会替换值而不是将新条目添加到数组中!

如何在数组中添加新条目而不是替换当前值,我更喜欢添加具有唯一 ID 或键的新条目以供将来参考

【问题讨论】:

【参考方案1】:

你可以像这样推入数组字段:

  $push: 
      keys:  
          'nickname': nickname, 
           'data1': data1,
           'data2': data2,  
           'data3': data3,
           'data4': data4
       
   

请注意,当您将新项目推送到数组中时,它会生成一个唯一的“_id”字段,以供将来参考

【讨论】:

【参考方案2】:
           $push:  
              keys:  
                nickname: nickname,
                data1: data1,
                data2: data2,
                data3: data3,
                data4: data4,
               
             
          ,

确实解决了问题:)

【讨论】:

以上是关于Mongoose - findOneAndUpdate 动态 $push 到数组中的主要内容,如果未能解决你的问题,请参考以下文章

在 @nestjs/mongoose 中设置 mongoose 全局选项

mongoose入门以及 mongoose 实现数据 的增删改查

mongoose使用之查询篇

Mongoose 错误 - 具有相同型号名称的 Mongoose 型号

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起