我正在使用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 :(得分: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/