私は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 }
]
}
何?
ありがとうございます!
サブドメインの配列に2つの異なる条件がある場合は、$ elemMatchを使用する必要があります。私はmongodb-javaの構文に慣れていないので、誰かが完全な答えを書くことを願っています。 –
'$ elemMatch'を使うと、すべてが期待どおりに動作します。私はあなたのコメントを投票することはできません、私の評判を引き起こす..私は私の質問の答えを書くでしょう。 – Mhidy