1

を使用して配列を検索してい$inますが、並べ替えが指定されていない場合、結果はどのような順序で返されますか?検索した配列の順に返してほしい。

4

2 に答える 2

2

一般に、ソート順を指定せずに検索した場合、結果の順序は保証されません。

さらに、配列でソートすることはできません (説明したように配列で配列をソートしたい場合はなおさらです)。sort()は論理比較を使用して、結果ドキュメント内のフィールドに基づいて昇順または降順を決定します。

必要なカスタム ソート ロジックを独自のアプリケーション コードに実装する必要があります。

有用なアプローチは、MongoDB 2.2 の新しいAggregation Frameworkを利用することです。特に、配列をドキュメントのストリームに$unwindする機能です。

たとえば、テスト データを次のように設定します。

{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }

$in[2,3] を検索すると、一致するドキュメントが得られます。

> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }

集約フレームワークを使用する$matchと、同じドキュメントを処理し、結果を操作して基本的な並べ替えを行うことができます:$unwind配列、$sortそれら、そして$groupこれらを結果に戻す:

db.matches.aggregate(
  { $match : {
       a: { $in: [2,3] }
  }},
  { $unwind : "$a" },
  { $sort: {
      "a": -1
  }},
  { $group : {
      _id: '$_id',
      a: { $addToSet: "$a" }
  }}
)

したがって、この例では、配列が一致するドキュメントが配列値の昇順で並べ替えられます。

{
    "result" : [
        {
            "_id" : ObjectId("504ac94eb50571321b2f932c"),
            "a" : [ 1, 2, 3]
        },
        {
            "_id" : ObjectId("504ac93fb50571321b2f932a"),
            "a" : [ 1, 2, 4 ]
        },
        {
            "_id" : ObjectId("504ac954b50571321b2f932d"),
            "a" : [ 3, 7, 9 ]
        }
    ],
    "ok" : 1
}
于 2012-09-08T04:46:38.713 に答える
0

簡単な答え: これは不可能です。

于 2012-09-08T03:53:19.303 に答える