MongoDB 更新日期的查询不适用于所有文档

MongoDB query to update dates doesn't work on all documents

基本上我想更新一个集合中的所有文档。更新只是将每个文档中存在的日期字段增加 2 小时。 这些文档都遵循这样的基本结构:

    {
        code : 1,
        file : {
            dates : {
                start : 2018-05-27 22:00:00.000Z,
                end : 2018-05-27 22:00:00.000Z,
            },
            otherInfos : {
                ...
                ...
            }
        }
    }

这是我的查询:

    var cursor = db.getCollection('files').find({});
        
    while(cursor.hasNext()){
        e = cursor.next();
        let delta = 120*60*1000; //2 hours
    
        if(e.file.dates) {
            let fileStartDate = e.file.dates.start ? new Date(e.file.dates.start.getTime() + delta) : null;
            let fileEndDate = e.file.dates.end ? new Date(e.file.dates.end.getTime() + delta) : null;
              
            if(fileStartDate) {
               e.file.dates.start = fileStartDate;
            }
            
            if(fileEndDate) {
               e.file.dates.end = fileEndDate;
            }
        }
        
        print(e);
        db.getMongo().getDB('myDB').files.updateOne(
            {"code":e.code},
            {
                $set: {"file.dates.start": fileStartDate, "file.dates.end": fileEndDate}
            })
    }

我正在用大约 20 个文档测试查询,前 10 个文档按预期完美打印并更新了 +2 小时,但对于后半部分,日期与以前完全相同(包括打印和更新) . 所有文档都具有相同的结构和相同的 Date 类型,所以我不明白为什么查询没有完全进行。

编辑: 这是已成功更新的文档:

    {
        "_id" : ObjectId("5b36c7fdd515e80009e7cc84"),
        "code" : "1",
        "file" : {
            "dates" : {
                "start" : ISODate("2018-06-11T22:00:00.000Z"),
                "end" : ISODate("2018-06-11T22:00:00.000Z")
            }
        }
    }

如期而至

    {
        "_id" : ObjectId("5b36c7fdd515e80009e7cc84"),
        "code" : "1",
        "file" : {
            "dates" : {
                "start" : ISODate("2018-06-12T00:00:00.000Z"),
                "end" : ISODate("2018-06-12T00:00:00.000Z")
            }
        }
    }

但是例如这个文档:

    {
        "_id" : ObjectId("5b36c7ffd515e80009e7cf03"),
        "code" : "15",
        "file" : {
            "dates" : {
                "start" : ISODate("2018-09-02T22:00:00.000Z"),
                "end" : ISODate("2019-09-26T22:00:00.000Z")
            }
        }
    }

保持原样

db.getMongo().getDB('myDB').files.updateOne(
        {"code":e.code},
        {
            $set: {"file.dates.start": fileStartDate, "file.dates.end": fileEndDate}
        })

updateOne 只允许更新一个文档

使用 MongoDBv4.2+,您可以使用聚合管道进行更新。使用 $add 递增 2 小时 * 60 分钟 * 60 秒 * 1000 毫秒。

db.collection.update({},
[
  {
    "$set": {
      "file.dates.start": {
        $add: [
          "$file.dates.start",
          7200000
        ]
      },
      "file.dates.end": {
        $add: [
          "$file.dates.end",
          7200000
        ]
      }
    }
  }
],
{
  multi: true
})

这里是Mongo playground供您参考。

您应该使用 updateMany() 更新超过 1 个文档 https://www.mongodb.com/docs/manual/reference/method/db.collection.updateMany/