2015-12-17 69 views
0

我有一個模式:addToSet如果不存在

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); 
}); 

該查詢增加了一個新元素UpdatedInfo陣列每一個新TheDate,即使TheNewInfoTheOriginalInfoUpdatedInfo的新元素相同。 我要的是一個新的元素添加到UpdatedInfo只有如果NewInfo確實從最新ThisDateNewInfoUpdatedInfo數組元素的變化。

眼下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爲空,從一開始,就應該第一元素添加進去,即:

"UpdatedInfo" : [ 
    { 
     "ThisDate" : "12/17/2015", 
     "NewInfo" : "12 500:-", 
     "OriginalInfo" : "15 000:-" 
    } 
] 

是否有可能? 問候

回答

1

使用$elemMatch檢查是否匹配TheOriginalInfo的元素,有它的NewInfo過時而忽略ThisDate總數:

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

閱讀$ (update)

如果您需要與數組或集合進行高級交互,我建議您將其移出集合。

MongoDB對集合的處理要比數組多得多。

+0

我的確有UpdatedPrice作爲之前的集合。但它重複了該集合中的數組元素然後... – user1665355

+0

@ user1665355我添加了一些解決方案。 –

+0

好的,謝謝,當你說試試$ elemMatch,你的意思是說你不確定它會工作嗎?:) – user1665355