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

Mar*_*nik 4 java mongodb mongodb-java mongodb-query

我有一个关于 $currentDate 的问题 ,使用 Java 驱动程序在 mongo db 中插入文档以使其包含“服务器时间”(如某些 RDBMS 中的“now()”)的最佳方法是什么?

例如,以免说我有一个类似的文档:

{
     name : "John",
     birthday : <$currentDate_goes_here>
}
Run Code Online (Sandbox Code Playgroud)

我想要的是插入文档,以便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);
Run Code Online (Sandbox Code Playgroud)

此操作因以下异常而失败:

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)

Nei*_*unn 5

在这种情况下,答案相当简单。它实际上是关于从 javaBasicDBObject类到基本 MongoDB 解释的序列化。不考虑您的实际“查询”文档,语句的“更新”文档部分应该是:

    BasicDBObject update = new BasicDBObject("$set", new BasicDBObject("name","john")
        .append("$currentDate", new BasicDBObject("birthrhday",true))
    ;
Run Code Online (Sandbox Code Playgroud)

相对于$currentDate所使用的修饰符,这确实会在“更新插入”或“修改”时使用“服务器时间”。

在这里需要明确的是,您不使用该.insert()方法,而是使用.insert(). 应用“查询”和“更新”语法。另请参阅$setOnInsert操作员是否特别不修改现有文档。

  • @MarkBramnik是的,它只是一个更新运算符,但您可以使用“upsert”作为选项来促进插入。所以是的,你可以这样插入数据, (2认同)