如何使用Java MongoDB Reactive驱动程序更新文档中的字段类型?

问题描述 投票:1回答:1

我在MongoDB集合中有一个文档:

  {
    "fOne": "strValue",
    "fTwo": {
      "nestedFArray": [
        {
          "dateF": "2010-01-02T13:00:01"
        },
        {
          "dateF": "2010-01-02T13:00:01"
        }
      ],
      "nestedFObject": {
        "anotherDateF": "2010-01-02T13:00:01"
      }
    }
  }

字段fTwo.nestedFArray[0].dateFfTwo.nestedFArray[1].dateFfTwo.nestedFObject.anotherDateF存储为字符串类型;当我有使用java mongo reactive driver的字段的json路径时,如何用DateTime类型替换此字段的类型?

$.fTwo.nestedFArray[0].dateF

$.fTwo.nestedFArray[1].dateF

$.fTwo.nestedFObject.anotherDateF

mongodb datetime mongodb-java
1个回答
0
投票

查询是一个聚合,它将字符串日期值转换为Date值。迭代来自聚合的结果列表,并在for循环中更新已修改的文档。请注意,该代码假定包含多个输入文档的集合。

Java代码:

import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoCollection;
import com.mongodb.reactivestreams.client.MongoDatabase;
import com.mongodb.client.model.UpdateOneModel;
import com.mongodb.client.model.WriteModel;
import com.mongodb.bulk.BulkWriteResult;
import java.util.*;

public class MongoReact {

    public static void main(String[] args) 
            throws Throwable {

        MongoClient mongoClient = MongoClients.create();
        MongoDatabase db = mongoClient.getDatabase("testdb");
        MongoCollection<Document> collection = db.getCollection("test");

        List<Bson> pipeline =    
            Arrays.asList(
                new Document("$project", 
                    new Document("fTwo.nestedFObject.anotherDateF", 
                        new Document("$dateFromString", 
                            new Document("dateString", "$fTwo.nestedFObject.anotherDateF")
                        )
                    )
                    .append("fTwo.nestedFArray",
                        new Document("$map", 
                            new Document("input", "$fTwo.nestedFArray") 
                                .append("as", "e")
                                .append("in",
                                    new Document("dateF",
                                        new Document("$dateFromString", 
                                            new Document("dateString", "$$e.dateF")
                                        )
                                    )
                                )
                            )
                        )
                )
            );

        SubscriberHelpers.ObservableSubscriber<Document> querySubscriber =
            new SubscriberHelpers.ObservableSubscriber<Document>();
        collection.aggregate(pipeline).subscribe(querySubscriber);
        querySubscriber.await();
        List<Document> resultDocs = querySubscriber.getReceived();

        List<WriteModel<Document>> updates = new ArrayList<>();

        for (Document doc : resultDocs) {
            ObjectId id = (ObjectId) doc.get("_id");
            Document f2Doc = (Document) doc.get("fTwo");
            updates.add(new UpdateOneModel<Document>(
                                new Document("_id", id), 
                                new Document("$set", new Document("fTwo", f2Doc))
            ));
        }

        SubscriberHelpers.PrintSubscriber<BulkWriteResult> updateSubscriber = 
            new SubscriberHelpers.PrintSubscriber<BulkWriteResult>("Bulk write results: %s");
        collection.bulkWrite(updates).subscribe(updateSubscriber);
        updateSubscriber.await();

        mongoClient.close();
    }
}

注:

SubscriberHelpers是以上代码中使用的实用程序类。我已经按照Reactive Streams Java Driver pageQuick Tour(带有示例)部分中的说明使用它。

SubscriberHelpers.java的源代码可在以下位置找到:mongo-java-driver-reactivestreams/examples/tour/src/main/tour/。该代码和示例源代码的用法也在那里-您可以编译和使用它。

我已使用MongoDB服务器4.0,Java SE 8,MongoDB Reactive Streams driver 1.10.0和mongodb-driver-async 3.9.0与上述代码一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.