4

次のようにデータを挿入して、次のクエリを実行しようとしています。なんらかの理由で、値が 0 の $ne は機能しないようです。v2.0.4を使用して、LinuxとMacの両方でこれを試しました。また、mongo シェルを使用してこれらを実行しました。

誰にもアイデアはありますか?これはバグですか、それとも私が誤解しているものですか?

db.associated.insert({
    "diskinfo" : {
            "physical" : [
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 509"}
            ]
    }})

db.associated.insert({
    "diskinfo" : {
            "physical" : [
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 5"},
                    {"merror_count" : "Count: 0"}
            ]
    }})

db.associated.insert({
    "diskinfo" : {
            "physical" : [
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"},
                    {"merror_count" : "Count: 0"}
            ]
    }})

これらのクエリを mongo シェルで実行しました。コメントで結果を取得しました

db.associated.find( { "diskinfo.physical.merror_count" : { $ne : 'Count: 0'}}).count()
// 結果: 0、予想: 2
db.associated.find( { "diskinfo.physical.merror_count" : { $ne : 'Count: 509'}}).count()
// 結果: 2、予想: 2
db.associated.find( { "diskinfo.physical.merror_count" : { $ne : 'Count: 5'}}).count()
// 結果: 2、予想: 2
4

3 に答える 3

4

これらの結果は正しいです。

予想は、述語に一致する埋め込み配列内の要素の数に基づいている場合があります。ただし、返されるのはクエリを満たすドキュメントの数です。

最初のケースでは、diskinfo.physical.merror_count が 'Count: 0' に等しくないすべてのドキュメントをクエリします。すべてのドキュメントには「Count: 0」の diskinfo.physical.merror_count があるため、0 が返されます。

コレクション内のすべてのドキュメントには、'Count: 0' 以外の diskinfo.physical.merror_count 値があります。不等式ではなく等式でクエリを実行すると、3 つすべてが返されます。

「Count: 0」のエントリのみを持つすべてのドキュメントを検索しようとしていますか?

これを行う簡単な方法はないようですが、これを取得するクエリの1つは次のとおりです。

db.associated.find( { "diskinfo.physical.merror_count" : { $gt : 'Count: 0'}}).count()

カウントが実際に整数である場合、少なくともこれが解決策になります。「1」>「0」などの理由で、たまたま文字列でも機能します。

于 2012-06-06T05:18:52.380 に答える