2017-02-19 11 views
0

Мы модернизированный (от 2.11.1) доMongoDB Java Client хранит "_ID" в нуле на "replaceOne"

  <groupId>org.mongodb</groupId> 
      <artifactId>mongo-java-driver</artifactId> 
      <version>3.4.1</version> 

Теперь, когда мы делаем это:

 UpdateOptions options = (new UpdateOptions()).upsert(true); 
     BasicDBObject queryObject = new BasicDBObject("_id", newObject.get("_id")); 
     //where newObject.get("_id") returns "null", i.e. same as 
     //BasicDBObject queryObject = new BasicDBObject("_id", null); 
     UpdateResult result = collection.replaceOne(queryObject, newObject, options); 

вставит новый документ с «_id» установлен равным null (даже если в коллекции не было объекта с _id из null). Когда мы делаем

 collection.insertOne(newObject); 

вместо этого создается правильный «_id». Почему «replaceOne» не генерирует правильный _id?

+0

Можете ли вы показать, что доступно на newObject перед выполнением replaceOne? – notionquest

ответ

0

Это ожидаемое поведение для replaceOne.

MongoDB добавит поле _id к заменяемому документу, если оно не указано ни в фильтре, ни в заменяющих документах. Если _id - , присутствующий в обоих, значения должны быть равны.

Таким образом, при создании нового документа он использует _id как null.

+0

Спасибо - это кажется правильным, хотя я, конечно, не ожидал такого поведения. Почему я хочу, чтобы «_id» из фильтра-объекта (особенно если он был нулевым) использовался как «_id» вновь созданного объекта? – Ronald

+0

Mongodb позволяет использовать один документ с нулевым идентификатором. Вы можете выполнить нулевую проверку; если значение _id равно null, тогда используйте insertOne else repalceOne. – Veeram