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);
我有一个关于 $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);