私は2ノードのMongoDBレプリカセットを持っています。Mongo javaドライバcollection.count()は常に1つを返します
コレクション内の典型的な文書では、次のようになります。私はいくつかの簡単なフィルタに基づいて、コレクションの数を、見つけるためにJava MongoDB Driverを使用する場合、私は常に取得
{
_id: 409,
status: "active"
address: [
{ id: 1000012, type: "primary", status: "active" },
{ id: 1000011, type: "primary", status: "inactive" },
{ id: 1000010, type: "primary", status: "inactive" }
],
}
1(例えば、もし余分私はcollection.count(...)
can return incorrect results in case of sharded collectionsことを公式ドキュメントを読み込む
db.collection.count({
"status": "active",
"address.type": "primary",
"address.status": "active"
});
が、私のはそれだけレプリカセットで、シャードではありません。実際の数は1299年の結果は1300である)です。
私は同じクエリをaggregate
和を印刷するときしかし、それは常に(1299)正しい:
db.collection.aggregate([
{ $unwind: "$address" },
{ $match: {
"status": "active",
"address.type": "primary",
"address.status": "active",
}},
{ $group: { _id: null, count: { $sum: 1 }}},
{ $project: { _id: 0, count: 1 }}
]);
この現象の理由何ができますか?
これは、集計に一致します。
db.collection.count({"address": {$elemMatch:{"status": "active", "type": "primary"}}, status: "active"});
すぐに確認してください。あなたの素早い応答ありがとうDanziger –
それは興味深い展望でした。私はチェックして、それぞれのidは正確に1回だけ存在します。 –
@TeenaGeorgeあなたはWiredTigerを使用していますか?もしそうなら、起動後に自動的に再計算されないdb.statsの状態が不安定になっている可能性があります。それらを再構築するには['db.collection.validate(true)'](https://docs.mongodb.com/manual/reference/method/db.collection.validate/)を実行してみてください。 https://jira.mongodb.org/browse/SERVER-19052およびhttps://jira.mongodb.org/browse/SERVER-19472を参照してください。 – Danziger