2016-11-02 3 views
1

Я использую mongo-java-driver:3.3.0 и пытаюсь обновить одно значение моего поддоку с помощью оператора $ inc и findOneAndUpdate, но только при определенных условиях (сравнение идентификаторов и фильтр большего размера).MongoDB Java Driver обновляет непревзойденный субдокумент

Ниже приведен фрагмент кода, чтобы воспроизвести проблему:

MongoCollection<Document> coll = db.getCollection("update_increase"); 

    Document docBefore = new Document() 
     .append("subdocs", Arrays.asList(
      new Document("id", "AAA").append("count", 10), 
      new Document("id", "BBB").append("count", 20) 
    )); 
    coll.insertOne(docBefore); 

    Document filter = new Document() 
     .append("subdocs.id", "BBB") 
     .append("subdocs.count", new Document("$gt", 7)); 

    Document update = new Document() 
     .append("$inc", new Document("subdocs.$.count", -7)); 

    Document docAfter = coll.findOneAndUpdate(
     filter, 
     update, 
     new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)); 

docBefore:

{ "_id" : { "$oid" : "5819c85977a8cb12f8d706c9" }, 
    "subdocs" : [ 
     { "id" : "AAA", "count" : 10 }, 
     { "id" : "BBB", "count" : 20 } 
    ] 
} 

docAfter:

{ "_id" : { "$oid" : "5819c85977a8cb12f8d706c9" }, 
    "subdocs" : [ 
     { "id" : "AAA", "count" : 3 }, 
     { "id" : "BBB", "count" : 20 } 
    ] 
} 

Что я ожидал это отсчет: 13 на втором subdoc (id: «BBB»), но я получил обновление по первому (счет: 3).

Это прекрасно работает, если удалить GreaterThan состояние линии (.. новый документ ("$ GT", 5) ..):

{ "_id" : { "$oid" : "5819c92577a8cb13404cfc91" }, 
    "subdocs" : [ 
     { "id" : "AAA", "count" : 10 }, 
     { "id" : "BBB", "count" : 13 } 
    ] 
} 

Что я делаю неправильно?

Спасибо!

+1

Вам нужно использовать $ elemMatch, если у вас есть два разных условия для массива subdocs. Однако я не знаком с синтаксисом mongodb-java, поэтому я надеюсь, что кто-то еще сможет написать полный ответ. –

+0

Используя '$ elemMatch', все работает так, как ожидалось. Я не могу голосовать за ваш комментарий, вызывать мою репутацию. Я напишу ответ на свой вопрос. – Mhidy

ответ

0

Это java equlivant для $ elemMatch.

Document filter = new Document("subdocs", new Document().append("$elemMatch", new Document().append("id", "BBB").append("count", new Document("$gt", 7)))); 
+0

Я писал ответ на свой вопрос, как предложил «Винс Боудрен» в своем комментарии. Но вы были быстрее меня:) спасибо, ребята! – Mhidy

Смежные вопросы