Mongo 在 Java 驱动程序中插入 $currentDate

Mongo insert $currentDate in Java Driver

我有一个关于 $currentDate 的问题 使用 Java 驱动程序在 mongo 数据库中插入文档以使其包含 "server time"(如某些 RDBMS 中的“'now()'”)的最佳方法是什么?

例如,假设我有这样的文档:

{
     name : "John",
     birthday : <$currentDate_goes_here>
}

我想要插入文档,以便 mongo 服务器 在服务器端插入时对日期进行评估。

这很关键,因为我们的服务器可能不会完全同步,并且需要有我们可以依赖的时间(例如 mongo 服务器上的时间)。

我正在为 mongo 使用标准 java 驱动程序,因此 Java 中的任何代码片段都非常受欢迎。

这是我目前尝试过的方法

 MongoClient mongoClient = new MongoClient();
 DB sampleDB = mongoClient.getDB("sampleDB");
 BasicDBObject update = 
          new BasicDBObject("$set", new     BasicDBObject("name","john")
              .append("$currentDate", new BasicDBObject("birthday",true)));
sampleDB.getCollection("col1").insert(update);

这件事因以下异常而失败:

java.lang.IllegalArgumentException: Document field names can't start with '$' (Bad Key: '$set') at com.mongodb.DBCollection.validateKey(DBCollection.java:1845) at com.mongodb.DBCollection._checkKeys(DBCollection.java:1803) at com.mongodb.DBCollection._checkObject(DBCollection.java:1790) at com.mongodb.DBCollectionImpl.applyRulesForInsert(DBCollectionImpl.java:392) at com.mongodb.DBCollectionImpl.insertWithCommandProtocol(DBCollectionImpl.java:381) at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:186) at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:165) at com.mongodb.DBCollection.insert(DBCollection.java:93) at com.mongodb.DBCollection.insert(DBCollection.java:78) at com.mongodb.DBCollection.insert(DBCollection.java:120)

在这种情况下,答案很简单。它实际上是关于从 java BasicDBObject 类 到基本 MongoDB 解释的序列化。在不考虑您的实际 "query" 文档的情况下,您声明的 "update" 文档部分应为:

    BasicDBObject update = new BasicDBObject("$set", new BasicDBObject("name","john")
        .append("$currentDate", new BasicDBObject("birthrhday",true))
    ;

相对于使用的 $currentDate 修饰符,在 "update insertion" 或 "modification" 点确实会使用 "server time"。

在这里要明确一点,您不使用 .insert() 方法,而是使用 "upsert"operation with .insert(). The "query" and "update" syntax applies. Also see the $setOnInsert 运算符,专门用于不修改现有文档。

如果您使用带有 update 方法的聚合管道,您也可以使用聚合变量“$$NOW”。

MongoClient mongoClient = new MongoClient();
DB sampleDB = mongoClient.getDB("sampleDB");
BasicDBObject update = 
          new BasicDBObject("$set", new BasicDBObject("name","john")
              .append("birthday", new BsonString("$$NOW")));
sampleDB.getCollection("col1").updateOne(query, List.of(update));

您还可以将 "$$NOW"$add$subtract 等聚合运算符一起使用,以在数据库端计算更具体的值(包括日期)。

如果要传递应用服务器的时间而不是数据库时间,请使用以下代码发送当前时间。如果应用程序服务器时间与数据库服务器时间不同,您应该决定是否使用它。

new BsonDateTime(Instant.now().toEpochMilli())

示例代码:

MongoClient mongoClient = new MongoClient();
DB sampleDB = mongoClient.getDB("sampleDB");
BasicDBObject update = 
          new BasicDBObject("$set", new BasicDBObject("name","john")
              .append("birthday", new BsonDateTime(Instant.now().toEpochMilli())));
sampleDB.getCollection("col1").updateOne(query, update);