Node + Mongodb +排序嵌套数组

时间:2016-05-06 06:37:04

标签: node.js mongodb

我正在使用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"}}}
]);

这里有点令人困惑。

1 个答案:

答案 0 :(得分:1)

聚合操作处理数据记录并返回计算结果。聚合操作将多个文档中的值组合在一起,并可以对分组数据执行各种操作以返回单个结果。

试试这个 -

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

db.collection.aggregate(管道,选项): - 计算集合中数据的聚合值。

     

管道$展开(聚合)阶段: - 从输入文档解构数组字段以输出每个元素的文档。   每个输出文档都是具有数组值的输入文档   字段由元素替换。

     
    

范例 -

         

考虑具有以下文档的库存项目:

         

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

  
     

以下聚合使用$ unwind阶段输出文档   对于sizes数组中的每个元素:

     
    

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

         

该操作返回以下结果:

         

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

  
     

管道$ sort(聚合)阶段: - 对所有输入文档进行排序   按排序顺序将它们返回到管道。

     

$ sort阶段具有以下原型形式:

     

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

     
    

范例 -

         

对于要排序的字段,请将排序顺序设置为1或-1     分别指定升序或降序排序,如     以下示例:

         

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

  
     

管道$ group(聚合)阶段: - 按部分分组文档   指定表达式并向下一阶段输出每个文档的文档   不同的分组。输出文档包含_id字段   按键包含不同的组。 $ group不会对其输出进行排序   文档。

     

$ group阶段具有以下原型形式:

     

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

     
    
      

累加器$ push: - 返回由此产生的所有值的数组       将表达式应用于一组文档中的每个文档       按键共享同一组。

             

$ push具有以下语法:

             

{ $push: <expression> }

             

$ push仅在$ group阶段提供。

    
  

有关详情,请参阅此链接 - https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/