我在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].dateF
,fTwo.nestedFArray[1].dateF
,fTwo.nestedFObject.anotherDateF
存储为字符串类型;当我有使用java mongo reactive driver的字段的json路径时,如何用DateTime类型替换此字段的类型?
$.fTwo.nestedFArray[0].dateF
$.fTwo.nestedFArray[1].dateF
$.fTwo.nestedFObject.anotherDateF
查询是一个聚合,它将字符串日期值转换为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 page的Quick 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与上述代码一起使用。