我有一个关于$currentDate的问题
使用Java驱动程序在mongo db中插入文档以使其包含“服务器时间”(如某些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)
在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)
最佳答案
在这种情况下,答案很简单。这实际上是关于从java BasicDBObject
类序列化到基本MongoDB解释的问题。不考虑实际的“查询”文档,语句的“更新”文档部分应为:
BasicDBObject update = new BasicDBObject("$set", new BasicDBObject("name","john")
.append("$currentDate", new BasicDBObject("birthrhday",true))
;
相对于所使用的
$currentDate
修饰符,它确实会在“更新插入”或“修改”时使用“服务器时间”。只是在这里要清楚,您不使用
.insert()
方法,而是使用.insert()
进行"upsert"操作。适用“查询”和“更新”语法。另请参见 $setOnInsert
运算符,以专门不修改现有文档。