Изменена реализация findOne при обновлении до mongo-java-driver 3.3.0

#mongodb #mongodb-java #mongodb-3.3

#mongodb #mongodb-java #mongodb-3.3

Вопрос:

Ранее мы использовали 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 реализации из коллекции в моем коде и действий на основе проверки, которые должны выполняться для insert и update соответственно.

Любое решение / предложение по этому вопросу приветствуется.

Ответ №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
 

Комментарии:

1. Вы можете прочитать это в документации в кратком обзоре

2. Что происходит, когда документ не может быть найден? Разве метод first() не вызовет исключение?

Ответ №2:

findOne() также не рекомендуется в NodeJS.

find().limit(1) является альтернативой.

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

Комментарии:

1. api.mongodb.com/java/3.3 Список<DBObject> obj = collection.find(запрос).skip(1000).limit(100).toArray();