Node + Mongodb +sorting嵌套数组

我正在使用mongodb节点。我尝试sorting嵌套数组。

示例json在monogodb中。

{ "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); }); }); 

我发现他们使用聚合函数的例子很less。

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

这里有点混乱。

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

尝试这个 –

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

db.collection.aggregate(pipeline,options): –计算集合中数据的聚合值。

stream水线$ unwind(聚合)阶段: –从input文档中解构数组字段,为每个元素输出一个文档。 每个输出文档都是由元素replace的数组字段值的input文档。

例子-

考虑以下文件的清单项目:

{ "_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" }

pipe道$ sort(汇总)阶段: – 对所有input文档进行sorting,并按sorting顺序将其返回到pipe道。

$ sort阶段有以下原型forms:

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

例子-

要对字段进行sorting,请将sorting顺序设置为1或-1,以分别指定升序或降序sorting,如下例所示:

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

pipe道$组(聚合)阶段: –按指定的expression式对文档进行分组,并将每个不同分组的文档输出到下一阶段。 输出文档包含一个_id字段,其中包含按键的不同组。 $组不订购其输出文件。

$ group阶段具有以下原型表单:

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

Accumulator $ push: –返回通过将expression式应用于按键共享相同组的文档组中的每个文档所产生的所有值的数组。

$ push具有以下语法:

{ $push: <expression> }

$推只在$ group阶段可用。

有关更多参考,请参阅此链接 – https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/