2016-11-02 15 views
1

私はmongo-java-driver:3.3.0を使用していますが、$ inc演算子とfindOneAndUpdateを使用してサブ文書の値を更新しようとしていますが、特定の条件(id比較とgreaterThanフィルタ)続き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

サブドメインの配列に2つの異なる条件がある場合は、$ elemMatchを使用する必要があります。私はmongodb-javaの構文に慣れていないので、誰かが完全な答えを書くことを願っています。 –

+0

'$ elemMatch'を使うと、すべてが期待どおりに動作します。私はあなたのコメントを投票することはできません、私の評判を引き起こす..私は私の質問の答えを書くでしょう。 – Mhidy

答えて

0

ここに$ elemMatchのjava equlivantがあります。

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

彼のコメントに「ヴィンス・ボーデンドン」が示唆したように、私は自分の質問に対する答えを書いていました。しかし、あなたは私よりも速かった:)おかげでみんな! – Mhidy

関連する問題