addToSet如果尚未存在

时间:2015-12-17 09:23:29

标签: arrays mongodb updates

我有一个架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var MySchema = new Schema({
    Theme: { type: String },
    Style: { type: String },
    Brand: { type: String },
    UpdatedInfo: [
            {
             _id:false, 
             ThisDate: { type: String },
             NewInfo: {type: String },
             OriginalInfo: {type: String }
            }
    ]    
}, { versionKey: false });

然后我做了更新:​​

MySchema.update({ Theme: MyTheme }, {
   $addToSet: {
      UpdatedInfo: {
         ThisDate: TheDate,
         NewInfo: TheNewInfo,
         OriginalInfo: TheOriginalInfo
      },
   }
},function (err, result) {
   next(err,result);
});

即使UpdatedInfoTheDateTheNewInfo的新元素中相同,该查询也会为每个新TheOriginalInfoUpdatedInfo数组添加一个新元素}。 如果UpdatedInfoNewInfo数组元素中的NewInfo更改为{{}},我想要的是向UpdatedInfo 添加新元素 {1}}约会。

现在,ThisDate数组如下所示:

UpdatedInfo

如果"UpdatedInfo" : [ { "ThisDate" : "12/15/2015", "NewInfo" : "12 500:-", "OriginalInfo" : "15 000:-" }, { "ThisDate" : "12/16/2015", "NewInfo" : "12 500:-", "OriginalInfo" : "15 000:-" }, { "ThisDate" : "12/17/2015", "NewInfo" : "12 500:-", "OriginalInfo" : "15 000:-" } ] 从一开始就是空的,那么它应该添加第一个元素,即:

UpdatedInfo

有可能吗? 最诚挚的问候

1 个答案:

答案 0 :(得分:1)

使用$elemMatch检查与TheOriginalInfo匹配的元素是否已将NewInfo过时,同时忽略ThisDate:

MySchema.update(
  {
    UpdatedInfo: {
      $elemMatch: {
        OriginalInfo: TheOriginalInfo,
        NewInfo: {$ne: TheNewInfo}
      }
    }
  },
  {
    $set: {
      "UpdatedInfo.$.NewInfo": TheNewInfo,
      "UpdatedInfo.$.ThisDate": TheDate
    }
  }
);

了解$ (update)

如果您需要与数组或集合进行高级互动,我建议您将其移至某个集合。

MongoDB使用集合比使用数组做得更多。