繁体   English   中英

MongoDB - 更新一个或另一个字段

[英]MongoDB - Update One Field or Another

我对 MongoDB 很陌生,所以这可能是我对它的缺乏经验。 我正在尝试做一个upsert ,当找到一条记录时,它将根据多个条件更新多个字段。

我在一个集合中有以下记录:

{
  modelId: "5e68c7eaa0887971ea6ef54c",
  versionId: 999,
  timeStamp: "1/1/2020",
  oldValue: 'Blue',
  newValue: 'Red'
}

我正在尝试使用单个upsert语句来满足以下条件,以避免多次访问数据库(基于找到与modelIdversionId匹配的文档的查询:

  1. 如果新记录的timeStamp在 ( lt ) 现有文档之前,则更新oldValue
  2. 如果新记录的timeStamp在( gt )现有文档之后,则更新newValue
  3. 如果未找到匹配记录,则插入新记录。

在伪代码术语中,我试图用upsert语句来做到这一点:

existingRecord = item in collection matching modelId and versionId

if(existingRecord = null)
{
   //insert newRecord
}
if(newRecord.timeStamp < existingRecord.timeStamp)
{
   existingRecord.oldValue = newRecord.oldValue
   existingRecord.timeStamp = newRecord.timeStamp
}
else if(newRecord.timeStamp > existingRecord.timeStamp)
{
   existingRecord.newValue = newRecord.newValue
   existingRecord.timeStamp = newRecord.timeStamp
}

我已经看到了根据日期条件进行upsert的可能性,例如:

db.collection.update( { id:o.id, date: { $lt:o.date } }, {$set : { o }}, {upsert:true} );

我不知道如何扩展它以便能够根据timeStamp值更新oldValuenewValue

我计划每天将大量记录插入集合中,估计大约 1MM,我不想为每条记录执行find()update()

我正在使用 Mongo 4.0,不胜感激。

谢谢!

好吧,在4.0 版本中,您不能在更新查询中使用条件。 因此,您最终会触发两个查询。

db.collection.update({condition}, { $set: { o } }, { multi: true ,upsert:true });
db.collection.update({!condition}, { $set: { n } }, { multi: true ,upsert:true });

但是,在4.2 版本中,添加了允许聚合的db.collection.update管道。

而且,它仅包含以下聚合阶段:

$addFields and its alias $set
$project and its alias $unset
$replaceRoot and its alias $replaceWith.

希望这会有所帮助:)

更新

我添加了$set阶段来更新文档。 如果时间戳条件为真,它将更新,否则不会更新。 并适用于其他条件。

我已经使用了可以根据您的情况使用的时间戳的长值。

db.collection.update(
  {
    modelId: "5e68c7eaa0887971ea6ef54c",
    versionId: 999,
  },
  [
    {
      $set:{
        "oldValue":{
          $cond:[
            {
              $lt:[
                "timestamp",
                1598598257000
              ]
            },
            "green",
            "$oldValue"
          ]
        }
      }
    },
    {
      $set:{
        "newValue":{
          $cond:[
            {
              $gt:[
                "timestamp",
                1518598257000
              ]
            },
            "pink",
            "$newValue"
          ]
        }
      }
    }
  ]
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM