【问题标题】:findOne implementation changed while upgrading to mongo-java-driver 3.3.0升级到 mongo-java-driver 3.3.0 时 findOne 实现发生了变化
【发布时间】:2016-10-15 14:57:15
【问题描述】:

我们之前使用 mongo-java-driver 3.0.4 ,在某个代码块中具有此实现 -

DBCollection docCollection = mongoClient.getDB(dbName).getCollection(collectionName);

Map<String, Object> docMap = doc.toMap(); // where doc is the CustomDocument

DBObject currentObj = docCollection.findOne(new QueryBuilder().put("id").is(doc.getId()).get());
if(currentObj == null) {
   docCollection.insert(new BasicDBObject(docMap));
} else {
   docCollection.update(currentObj, new BasicDBObject(docMap));
}

我现在想要实现的是使用mongo-java-driver 3.3.0 并更新代码以摆脱不推荐使用的类和方法。我尝试对应于上述代码的是 -

MongoCollection<CustomDocument> docCollections = mongoClient.getDatabase(dbName).getCollection(collectionName, CustomDocument.class);

Bson filter = Filters.eq("id", doc.getId()); // where doc is the CustomDocument
FindIterable<Document> documentList = docCollections.find(filter);
if (documentList == null) {
    docCollections.insertOne(doc);
} else {
    docCollections.findOneAndUpdate(filter, new BasicDBObject(docMap));
}

我仍然发现缺少的是我的代码中集合中的 findOne 实现以及相应地为 insertupdate 执行的基于检查的操作。

欢迎对此提出任何解决方案/建议。

【问题讨论】:

    标签: mongodb mongodb-java mongodb-3.3


    【解决方案1】:

    我在mongo-java-driver 3.3.0 中找到了一个解决方案。

    现在执行findOne 的简单方法如下 -

    MongoCollection<CustomDocument> docCollections = mongoClient.getDatabase(dbName).getCollection(collectionName, CustomDocument.class);
    CustomDocument firstDocument = docCollections.find(filter).first(); //first for findOne
    

    【讨论】:

    • 你可以在the Quick Tour的文档中阅读
    • 找不到文档怎么办? first() 方法不会引发异常吗?
    【解决方案2】:

    findOne() 在 nodeJS 中也已弃用。

    find().limit(1) 是备选方案。

    http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findOne

    【讨论】:

    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多