【问题标题】:Push or add to collection in mongoose在猫鼬中推送或添加到收藏
【发布时间】:2015-10-22 21:15:19
【问题描述】:

我有很多对象要保存到 Mongoose。它们是深层物体。

var obj1 = {
  first_name : 'adam',
  last_name: 'smith',
  car : [{
    make: 'honda',
    model: 'civic',
    colors: [{
      name: 'red',
      code: 'ff0000'
    }]
  }]
}

像这样进入匹配模型:

var Owner = new Schema({
    first_name: String, 
    last_name: String,
    cars:[{
        make: String,
        model: String
        colors: [{
          name: String,
          code: String
        }]
    }]
});

这一切都很好,花花公子,除非亚当有第二条记录:

var obj2 = {
  first_name : 'adam',
  last_name: 'smith',
  car : [{
    make: 'ford',
    model: 'focus',
      colors: [{
        name: 'blue',
        code: '0000ff'
      }]
  }]
}
var obj3 = {
  first_name : 'adam',
  last_name: 'smith',
  car : [{
    make: 'honda',
    model: 'civic',
      colors: [{
        name: 'blue',
        code: '0000ff'
      }]
  }]
}

当我执行以下操作时,每个都会完全覆盖前一个:

Owner.findOneAndUpdate({first_name:"adam", last_name: "smith"}, obj2, {upsert: true});

如何让猫鼬在没有新记录时创建新记录,但在有时附加到 car 数组?如果汽车已经存在,附加到颜色数组?

为了让事情更有趣,我的数据结构并不一致。它适用于给定的集合,但我的每个集合都是动态设置的,因此模型可能有很多层深并且具有任何给定的键。

【问题讨论】:

    标签: arrays insert mongoose


    【解决方案1】:

    这种方法允许您将新元素推送到数组字段中

    db.findOneAndUpdate( 
    
        {first_name:"adam", last_name: "smith"},
        {   $push: { cars : {
                            make: 'ford',
                            model: 'focus'
                        }
                    }
        },
    
        {   safe: true, 
            upsert: false, 
            new : true
        }
    );
    

    对于尝试猜测任意复杂的插入/更新/删除的语法,我感到很痛苦...... mongo/mongoose 的世界正在呼唤一种工具来读取模式/数据并让您以交互方式描述您的详细信息以合成代码 sn -ps 同上

    【讨论】:

    • 用 upsert true 和 false 都试过了,仍然没有保存记录。稍微修改一下问题。
    • 即使在明确创建第一级记录后调用它,我也没有得到任何更深的存储。我可能不得不回到这个绘图板上。
    猜你喜欢
    • 2019-10-13
    • 2016-01-29
    • 2019-03-22
    • 2019-01-01
    • 2018-09-19
    • 2015-06-08
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多