2017-02-08 9 views
1

私はmongoドキュメントのオブジェクト(これもオブジェクトです)の値を照会、ソート、フィルタリングする方法を見つけようとしています。文書構造は、動的なキーでオブジェクト1000を含むことができ、mongodbのオブジェクトの値を照会、ソート、フィルタリングする方法は?

{ 
    _id: '', 
    uid: '12345', 
    objects:{ 
     dkey1: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     }, 
     dkey2: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     }, 
     dkey3: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     }, 
     dkey4: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     } 
     ... 
    } 
} 

objects特性です。 Theryはハッシュベースのユニークキーです。これらのオブジェクトを取得すると、私はすべてを返すことを望んでいません。私は彼らが別のドキュメントからのものである場合、それができるようにクエリ、並べ替え、制限したい。たとえば、prop1 = val1と指定した場合、prop2の制限10の場合、prop1prop2でソートされたobjectsの最初の10個のサブオブジェクトが返されます。

普通のfindではできないと思います。ですから、私は集約フレームワークを試しています。第1ステージではuidで試合を行います。次?私はそこで混乱している。動的なキーを持つオブジェクトの代わりに、オブジェクトの配列の場合は、$unwindを実行し、後の段階で、内部プロパティ(prop1prop2 ...)のフィルタを実行して、問題は、オブジェクトの配列ではないということです。 objectsオブジェクトの値をオブジェクトの配列に変換する方法があれば、より簡単になります。私は道を探していたが、解決策を見つけることができなかった。

私は構造が良くないことを知っていて、スキーマを変更すると私を助けます。しかし、私は状況にある、私は今それを変更することはできません。 objectsの値をオブジェクトの配列に変換する方法はありますか?あるいは、他のいくつかの集約パイプラインステージで同じ結果を達成する異なる方法がありますか?

答えて

-1

これは通常の検索ではどうしてできないのですか? documentsによると、集計操作は「複数の文書の値をまとめてグループ化する」ことであり、正しく理解すれば、ここでやりたいことではありません。

これを試してみてください:

db.objects.find({prop1: 'val1'}).sort({prop2: 1}).limit(10) 

これはモンゴで試験したがソートにあなたのコレクション

  • 数だろう

    • オブジェクトをシェル昇順を意味し、-1です降順にする
    • と数字あなたは、ドット表記を使用し、別の文書内の文書のプロパティにアクセスする場合は上限の10は編集----

      ---もちろんの限界値

    です。

    例:db.objects.find({'nestedobj.prop1': 'val1'})

    ---編集2 ---

    今、私は私はあなたの質問を誤解参照してください。ソーリー。ここでの問題は、埋め込まれたドキュメントにアクセスできるようにする演算子がないと思うということです(私は本当にわかりませんが、私はそれを見ることができますが、今はありません)。

    しかし、「集計」を使用する場合、「$ match」は結果をフィルタリングすることになるので、uidはそのパイプラインステージには載っていないことを伝えておいてもいいかもしれません。 MongoDB 2.4はデータベースで実行されるJavascript関数をサポートしていますが、前述のように集約フレームワークの目的はドキュメントをマップすることであり、これは最良のシナリオではありません。私は、あなたが望むものを達成するためにデータベースエンジンの性能と能力を心配しています。しかし、私はアイデアを却下する前にそれをテストすべきだと思います。

    ご迷惑をおかけして申し訳ありませんが、私はあなたの問題を解決できることを願っています。あなたがすれば、私に教えて!

  • 関連する問題