MongoDBの代わりに$が存在する

私は100000のドキュメントを持っており、最高の値を持つ上位10のドキュメントを取得する必要があります。

単純化されたドキュメントの例を次に示します。

{
    "_id" : ObjectId( "4f2fbeb0369a2ba603000000" ),
    "usage" : {
        "2012" : {
            "2" : {
                "project" : {
                    "4f182a76369a2b2903000000" : {
                        "site" : {
                            "1" : 5,
                            "2" : 1
                        }
                    }
                }
            }
        }
    }
}

ソート/リミットが適用される値は、 'usage.2012.2.project.4f182a76369a2b2903000000.site.1'にあります(上記の例の場合、値は5です)。

問題は、いくつかの文書ではこのオブジェクトが存在し、他のオブジェクトでは存在しないということです。

$ existsを使ってオブジェクトが存在するかどうかを調べることができますが、$ existsを使っているMongoDBのマニュアルによれば、非効率的です。私がこれを行うことについて行くことができる別の方法がありますか?必要に応じてスキーマを変更することができます..

1
実行しているクエリは何ですか?
追加された 著者 Eve Freeman,
オブジェクトが存在しない場合、何を返す必要がありますか?結果セットから除外できますか?
追加された 著者 Brian Knight,
申し訳ありませんが、私は言ったのです。はい、除外する必要があります(100000コレクションを約1000に絞り込む必要があります。ソートの制限は10に制限されます)。
追加された 著者 RichW,

1 答え

特定の文書に存在しない値に基づいて照会すると、その値を含まない文書は結果セットから除外されます。あらかじめ$ existsを使ってフィルタリングする必要はありません。

db.collection.find().sort( { "usage.2012.2.project.4f182a76369a2b2903000000.site.1" : -1 } ).limit(10)

上記のクエリでは、最大10個の値しか返されません。ソートフィールドが存在しないドキュメントは考慮されません。

3
追加された
私は完全に理解していないかもしれません。プロジェクトIDとサイトIDを事前に把握していますか?
追加された 著者 Brian Knight,
問題ない。上記の私の答えを編集しました。
追加された 著者 Brian Knight,
申し訳ありません - あなたはドット表記を使うことができます - 単に表記を引用符で囲みます。私は上で編集しました。
追加された 著者 Brian Knight,
私は彼が文書を参照していたと仮定しています。
追加された 著者 Brian Knight,
私は "コレクション"と仮定しています。OPは実際のMongoDBコレクションを意味するものではありませんか?非常に混乱しやすい質問。
追加された 著者 Remon van Vliet,
私は値に基づいてクエリを実行できるとは思っていません。その値を事前に知らないので(全体の目的は、最も高い数値を含む10個のコレクションを返すことです)、基本的に2012.2でフィルタリングされ、プロジェクトIDとサイトID 。
追加された 著者 RichW,
うん、それは正しいです。混乱させて申し訳ありません!
追加された 著者 RichW,
面白いアイデアがある..私は-1について知らなかった、非常に便利なようだ。残念ながら、私は 'SyntaxError:missing:after property id(shell):1'を取得します。クエリを実行する唯一の方法は、ソートクエリを使用法に変更することです:-1、明らかに間違っています。たぶんソートパラメータにドット表記を渡すことはできません。
追加された 著者 RichW,
謝罪、私は書類を意味しました!私は将来の参考のために質問を編集します。とにかくおかげさまで、それは今動作します!
追加された 著者 RichW,