-
Type:
Bug
-
Resolution: Works as Designed
-
Priority:
Major - P3
-
None
-
Affects Version/s: 3.8.2
-
Component/s: API
-
None
-
Environment:Java 8, MongoDB 4.0.6 Enterprise
-
None
-
None
-
None
-
None
-
None
-
None
-
None
I am having problems using custom keys with nested objects.
If I insert a record successfully I cannot find it by its key. If I try to use the ReplaceOneModel with upsert=true, then I get BulkWriteException :
rite errors: [BulkWriteError{index=0, code=66, message='After applying the update, the (immutable) field '_id' was found to have been altered to _id:.......
If i remove the nested object everything works fine tough.....
This simple test fails with a complex key:
public static class TestKeyComplex { private String name; private Integer rowNum; private int teszt; private List<String> strings; public TestKeyComplex(String value) { strings = new ArrayList<>(); strings.add("Hello"); } public TestKeyComplex() { strings = new ArrayList<>(); strings.add("Hello"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getRowNum() { return rowNum; } public void setRowNum(Integer rowNum) { this.rowNum = rowNum; } public int getTeszt() { return teszt; } public void setTeszt(int teszt) { this.teszt = teszt; } public List<String> getStrings() { return strings; } public void setStrings(List<String> strings) { this.strings = strings; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TestKeyComplex that = (TestKeyComplex) o; return teszt == that.teszt && Objects.equals(name, that.name) && Objects.equals(rowNum, that.rowNum) && Objects.equals(strings, that.strings); } @Override public int hashCode() { return Objects.hash(name, rowNum, teszt, strings); } } public static class TestValue { private String name; private Integer rowNum; private Date date; private EmbeddedTestClass embeddedTestClass; public TestValue() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getRowNum() { return rowNum; } public void setRowNum(Integer rowNum) { this.rowNum = rowNum; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public EmbeddedTestClass getEmbeddedTestClass() { return embeddedTestClass; } public void setEmbeddedTestClass(EmbeddedTestClass embeddedTestClass) { this.embeddedTestClass = embeddedTestClass; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TestValue testValue = (TestValue) o; return Objects.equals(name, testValue.name) && Objects.equals(rowNum, testValue.rowNum) && Objects.equals(date, testValue.date) && Objects.equals(embeddedTestClass, testValue.embeddedTestClass); } @Override public int hashCode() { return Objects.hash(name, rowNum, date, embeddedTestClass); } } @Test public void dummyDataSimpleComplexKeyInsert() { MongoDatabase db = mongoClient.getDatabase("TODO"); MongoCollection mongoCollection = db.getCollection("TODO"); /* set codec and other stuff */ //fill object with data.. // TODO - MongoTestDataComplexKey -> contains key and value MongoTestDataComplexKey data = new MongoTestDataComplexKey(dummyKeyComplex, dummyValue); // Insert typedCollection.insertOne(data); assertEquals(1, typedCollection.find().into(new ArrayList<>()).size()); // Find MongoTestDataComplexKey res = typedCollection.find(eq("_id", dummyKey)).first(); assertNotNull(res); // ------>>>> fails with null! assertEquals(dummyValue, res.getValue()); // Delete typedCollection.deleteOne(eq("_id", dummyKey)); assertEquals(0, typedCollection.find().into(new ArrayList<>()).size()); }