2017-05-09 9 views
1

私は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"});

答えて

1

最初のクエリ:

db.collection.count({ 
    "status": "active", 
    "address.type": "primary", 
    "address.status": "active" 
}); 

aggregationと1と同じように計算されていません。これはstatus = "active"のANYのアドレスがtype = "primary"またはstatus = "active"のすべての文書(サブ文書ではない)を選択しています。私はあなたがいることと一致する1300件のドキュメントを持っていますが、それらのうちの少なくとも1つが$unwindを使用している場合ので、集約フレームワークと異なる結果を返す、同じサブ文書の中address.typeaddress.status条件に一致しないと仮定し、あなたの質問やコメント投稿者

その場合、その2つは同じサブ文書内で一致する必要があります。ハードクラッシュ後

WiredTiger問題:

ただ、他の人のためのリファレンスとしてWiredTigerを使用した場合、別のまれな問題は、ハードクラッシュです:

あなたのストレージエンジンとしてWiredTigerを使用している場合は、問題復旧時に矛盾した状態のdb.statsにつながったハードクラッシュによって引き起こされる可能性があります。データは正常に復旧したにもかかわらず、起動後に自動的に再計算されません。再構築するには、db.collection.validate(true)を実行してください。この問題の詳細については

、以下を参照してください

+0

すぐに確認してください。あなたの素早い応答ありがとうDanziger –

+0

それは興味深い展望でした。私はチェックして、それぞれのidは正確に1回だけ存在します。 –

+0

@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

関連する問題