Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-更新一个字段或另一个字段_Mongodb_Mongodb Query_Upsert - Fatal编程技术网

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

MongoDB-更新一个字段或另一个字段,mongodb,mongodb-query,upsert,Mongodb,Mongodb Query,Upsert,我对MongoDB还很陌生,所以这可能是我的经验不足。我正在尝试执行一个upsert,当找到一条记录时,它将根据多个条件更新多个字段 我收集了以下记录: { 型号ID:“5e68c7eaa0887971ea6ef54c”, 版本ID:999, 时间戳:“1/1/2020”, oldValue:'蓝色', newValue:“红色” } 我试图用一个upsert语句来满足以下条件,以避免多次访问数据库(基于找到与modelId和versionId匹配的文档的查询): 如果新记录的timeStam

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

我收集了以下记录:

{
型号ID:“5e68c7eaa0887971ea6ef54c”,
版本ID:999,
时间戳:“1/1/2020”,
oldValue:'蓝色',
newValue:“红色”
}
我试图用一个
upsert
语句来满足以下条件,以避免多次访问数据库(基于找到与
modelId
versionId
匹配的文档的查询):

  • 如果新记录的
    timeStamp
    在现有文档之前(
    lt
    ),则更新
    oldValue
  • 如果新记录的
    timeStamp
    位于现有文档之后(
    gt
    ),则更新
    newValue
  • 如果未找到匹配的记录,请插入新记录
  • 在psuedo代码术语中,我试图通过
    upsert
    语句来实现这一点:

    existingRecord=集合中与modelId和versionId匹配的项
    if(existingRecord=null)
    {
    //插入新记录
    }
    if(newRecord.timeStampexistingRecord.timeStamp)
    {
    existingRecord.newValue=newRecord.newValue
    existingRecord.timeStamp=newRecord.timeStamp
    }
    
    我已经看到了根据日期条件执行
    向上插入的可能性,例如:

    db.collection.update( { id:o.id, date: { $lt:o.date } }, {$set : { o }}, {upsert:true} );
    
    我不知道如何扩展它,以便能够根据
    时间戳
    值更新
    旧值
    新值

    我计划每天在集合中插入大量的记录,估计大约1毫米,我不想对每个记录执行
    find()
    ,然后执行
    update()

    我正在使用Mongo4.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版中,添加了允许聚合的管道

    并且,它只包含以下聚合阶段:

    $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"
              ]
            }
          }
        }
      ]
    )
    

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

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

    但是,在4.2版中,添加了允许聚合的管道

    并且,它只包含以下聚合阶段:

    $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"
              ]
            }
          }
        }
      ]
    )
    

    感谢大家的提醒,我确实看到了聚合选项,因此我可能可以升级到4.2,但是当查看聚合时,我不确定如何在一个语句中同时满足这两个条件。您是否知道任何使用聚合的示例,这些聚合有2个条件,每个条件都有其on$set?Hi@ODotN,我已经更新了答案,并设法在单个查询中执行所有查询。请看一看。)坦克@Vijay-这似乎是一条路要走。我会尝试一下,我确实看到了聚合选项,所以我可能可以升级到4.2,但是当查看聚合时,我不确定如何在一个语句中实现这两个条件。您是否知道任何使用聚合的示例,这些聚合有2个条件,每个条件都有其on$set?Hi@ODotN,我已经更新了答案,并设法在单个查询中执行所有查询。请看一看。)坦克@Vijay-这似乎是一条路要走。我试试看