我有一个关于$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 运算符,以专门不修改现有文档。

10-08 07:41