我有一个关于$currentDate的问题 在mongo db中插入文档以便它使用Java驱动程序包含“服务器时间”(如某些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:文档字段名称不能以'$'开头(坏键:'$ set') 在com.mongodb.DBCollection.validateKey(DBCollection.java:1845) 在com.mongodb.DBCollection._checkKeys(DBCollection.java:1803) 在com.mongodb.DBCollection._checkObject(DBCollection.java:1790) 在com.mongodb.DBCollectionImpl.applyRulesForInsert(DBCollectionImpl.java:392) at com.mongodb.DBCollectionImpl.insertWithCommandProtocol(DBCollectionImpl.java:381) 在com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:186) 在com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:165) 在com.mongodb.DBCollection.insert(DBCollection.java:93) 在com.mongodb.DBCollection.insert(DBCollection.java:78) 在com.mongodb.DBCollection.insert(DBCollection.java:120)
答案 0 :(得分:3)
在这种情况下答案很简单。它实际上是关于从java BasicDBObject
类到基本的MongoDB解释的序列化。不考虑您的实际“查询”文档,您的陈述的“更新”文档部分应为:
BasicDBObject update = new BasicDBObject("$set", new BasicDBObject("name","john")
.append("$currentDate", new BasicDBObject("birthrhday",true))
;
对于使用的$currentDate
修饰符,确实会在“更新插入”或“修改”时使用“服务器时间”。
为了清楚起见,您不要使用.insert()
方法,而应使用.insert()
进行"upsert"操作。 “查询”和“更新”语法适用。另请参阅$setOnInsert
运算符,以明确不修改现有文档。
答案 1 :(得分:0)
如果您通过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
等)结合使用,以在数据库端计算更具体的值(包括日期)。
答案 2 :(得分:0)
如果要传递应用服务器的时间而不是数据库时间,使用以下代码发送当前时间。如果应用服务器时间与数据库服务器时间不同,您应该决定是否使用它。
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);