在mongoose中推送或添加到集合

时间:2015-10-20 21:14:42

标签: arrays insert mongoose

我有很多对象我要保存到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});

如果没有一个新记录,我如何让mongoose创建一个新记录,但如果有,则附加到car数组?如果汽车已经存在,请附加到颜色数组?

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

1 个答案:

答案 0 :(得分:1)

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

db.findOneAndUpdate( 

    {first_name:"adam", last_name: "smith"},
    {   $push: { cars : {
                        make: 'ford',
                        model: 'focus'
                    }
                }
    },

    {   safe: true, 
        upsert: false, 
        new : true
    }
);

我觉得你在试图猜测任意复杂的插入/更新/删除的语法时感到痛苦...... mongo / mongoose的世界正在尖叫一个工具来读取模式/数据并让你以交互方式描述你的细节以合成代码片段像上面那样