Mongo在Java Driver中插入$ currentDate

时间:2015-03-11 11:56:38

标签: java mongodb mongodb-query mongodb-java

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

3 个答案:

答案 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);