gpt4 book ai didi

node.js - Node + Mongodb + 排序嵌套数组

转载 作者:可可西里 更新时间:2023-11-01 10:42:21 26 4
gpt4 key购买 nike

我正在将 Node 与 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 的结果。否则需要显示所有列表。

我附上了我的 Node 代码:

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

这里有点困惑。

最佳答案

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

试试这个-

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

db.collection.aggregate(pipeline, options):- Calculates aggregate values for the data in a collection.

Pipeline $unwind (aggregation) stage:- Deconstructs an array field from the input documents to output a document for each element. Each output document is the input document with the value of the array field replaced by the element.

Examples-

Consider an inventory items with the following document:

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

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

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

The operation returns the following results:

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

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

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

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

Examples-

For the field or fields to sort by, set the sort order to 1 or -1 to specify an ascending or descending sort respectively, as in the following example:

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

流水线 $group(聚合)阶段:- 按某些方式对文档进行分组 指定表达式并输出到下一阶段的每个文档 不同的分组。输出文档包含一个 _id 字段,该字段 包含按键不同的组。 $group 不对其输出进行排序 文档。

$group阶段的原型(prototype)形式如下:

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

Accumulator $push:- Returns an array of all values that result from applying an expression to each document in a group of documents that share the same group by key.

$push has the following syntax:

{ $push: <expression> }

$push is only available in the $group stage.

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

关于node.js - Node + Mongodb + 排序嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37065869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com