MongoDB の $currentDate は Insert 時には、指定できない。


MongoDBで古いドキュメントを自動削除する二つの方法 - Qiita
の TTL index 作成時に、createAt に MongoDB サーバー時刻 を設定したくて、
$currentDate を使ってinsert 時に設定しようと試みたのですが、エラーが出力されたため、原因をまさぐっていたところ、
以下 Stack Overflow の質問がヒットしました。
datetime - MongoDB insert “$currentDate” field - Stack Overflow

どうも、現在(2017/06/13) は、insert 時には、指定できないようです。
[SERVER-13695] Support $currentDate expression for insert - MongoDB


Insert してから、Update で $currentDate を指定する

回避策として、upsert すれば設定できそうだったので、
以下の通り、upsert で、$currentDate を指定するようにしました。
実際にはどう動作しているのかはわかりませんが、createAt には、時刻が設定できました。

    Document updateDocument = new Document()
            .append("$set", new Document("data", data).append("session_key", key))
            .append("$currentDate", new Document("createdAt", true));
    collection.updateOne(Filters.eq("session_key", key), updateDocument, new UpdateOptions().upsert(true));

MongoDB java driver の version

順番が違いますが、3.2.2 です。

    <!-- MongoDB -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.2.2</version>
    </dependency>

以上です。

コメント