2016-05-06 1 views
1

は、ネストされた配列をソートしてみてください。ノード+ MongoDBの+ソートネストされた配列

monogodbで例JSON。

{ 
    "items": [ 
     { 
      "name": "A", 
      "order": 3 
     }, { 
      "name": "B", 
      "order": 2 
     }, { 
      "name": "C", 
      "order": 1 
     }, { 
      "name": "D", 
      "order": 4 
     } 
    ], 
    "name": "Test", 
     "_id" : 01245678913 
} 
{ 
    "items": [ 
     { 
      "name": "A", 
      "order": 3 
     }, { 
      "name": "B", 
      "order": 2 
     }, { 
      "name": "C", 
      "order": 1 
     }, { 
      "name": "D", 
      "order": 4 
     } 
    ], 
    "name": "Test", 
     "_id" : 098765432134 
} 

私は結果が注文に基づいて表示されるはずです。

items.orderここでの可能なIDを渡すために。 Idを取得すると、それぞれのIdの結果が表示されます。それ以外の場合はすべてのリストを表示する必要があります。

私は自分のノードのコードを添付:

router.post('/get', function(req, res, next) { 

     var results = { 
      resp : {}, 
      id : null, 
      query : {} 
     }; 

     if (!(typeof req.body['id'] === 'undefined' || req.body['id'] === null)) { 
      results.id = req.body['id']; 
     } 

     Q(results).then(function(results) { 
      var deferred = Q.defer(); 
      var collection = mongoUtil.list; 
      if (results.id != null) { 
       results.query._id = ObjectId(results.id); 
      } 


      collection.find(results.query).toArray(function(err, lists) { 

       if (!err && lists.length > 0) { 
        results.resp.lists = lists; 
        deferred.resolve(results); 
       } else { 

        results.resp.message = 'No List'; 
        results.resp.debug = err; 
        deferred.reject(results); 
       } 
      }); 
      return deferred.promise; 
     }).then(function(results) { 
      results.resp.message = 'Result found'; 
      results.resp.status = 'Success'; 
      res.send(results.resp); 
     }).fail(function(results) { 
      results.resp.status = 'Error'; 
      res.send(results.resp); 
     }); 

    }); 

私は、彼らが集約関数を使用して、いくつかの例を見つけました。

collection.aggregate([ 
    {$unwind: "$answers"}, 
    {$sort: {"item.order":1}}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}}} 
]); 

ここで少し混乱します。

+0

'あなたは私に美貌を示唆しているaggregate'。何が悪かったのか? – hyades

+0

上記のコードは私には役に立たない。 ==== >>>> collection.aggregate( {$ unwind: "$ answers"}、 {$ sort:{"item.order":1}}、 {$ group:{_id: "$ _id "、answers:{$ push:" $ answers "}}} ]); – RSKMR

答えて

1

集計業務プロセス・データ・レコードと、計算結果を返します。集計操作では、複数の文書の値をグループ化し、グループ化されたデータに対してさまざまな操作を実行して単一の結果を返すことができます。

はこれを試してみてください -

collection.aggregate([ 
    { $unwind: "$items" }, 
    { $sort: { "items.order": 1 } }, 
    { $group: { _id: "$_id", items: { $push: "$items" } } } 
]); 

db.collection.aggregate(パイプライン、オプション): -は、コレクション内のデータの集計値を計算します。

パイプライン$ unwind(aggregation)ステージ: -入力ドキュメントから配列フィールドを解読し、各要素のドキュメントを出力します。 各出力ドキュメントは、配列 の値が要素に置き換えられた入力ドキュメントです。

例 -

以下の文書と在庫アイテムを検討してください。

{ "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }

次凝集が各要素の出力に文書 を$アンワインドのステージを使用しサイズ配列で:

db.items.aggregate([ { $unwind : "$sizes" } ])

操作は次の結果を返します。

{ "_id" : 1, "item" : "ABC1", "sizes" : "S" } { "_id" : 1, "item" : "ABC1", "sizes" : "M" } { "_id" : 1, "item" : "ABC1", "sizes" : "L" }

パイプライン$ソート(集約)段階: -ソートすべての入力ドキュメントと ソートされたパイプラインに戻します注文。、ソート1にソート順を設定したりするフィールドまたはフィールドの場合

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

例 -

- :

$ソートステージは、次のプロトタイプのフォームを持っています1〜 は、それぞれ次のように昇順または降順のソートを指定します。

db.users.aggregate( [ { $sort : { age : -1, posts: 1 } } ])

パイプライン$群(集合)の段階: - 次の段階各 異なるグループ化文書に発現して出力指定されたいくつかの によってグループ文書。出力文書には_idフィールドがあり、 にはキー別のグループが含まれています。 $ groupはその出力を の出力にしません。

$グループステージは、次のプロトタイプの形式を有する:

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }

アキュムレータ$プッシュ -は、各文書に式を適用 から生じるすべての値の配列を返し が同じグループをキーで共有している文書群では、

$プッシュの構文は次のとおりです。

{ $push: <expression> }

$のプッシュは、$グループステージでのみ使用可能です。

以上の基準については、このリンクを参照してください - https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

+0

@RSKMR、これはあなたの混乱を少しクリアすることを願っています。 –

関連する問題