gpt4 book ai didi

mongodb - Mongoose 按字段分组和分组结果应存储为 groupname : object

转载 作者:行者123 更新时间:2023-12-05 01:17:05 24 4
gpt4 key购买 nike

对于以下 Schema(伪代码)。

new mongoose.Schema({
name: {type: String, unique: true},
foo: {type: Number},
bar: {type: Number, default: null},
}

正常结果是 .find():

[{
_id: x
name: 'Name1'
foo: 1
bar: 222
}, {
_id: y
name: 'Name2'
foo: 1
bar: 333
}, {
_id: z
name: 'Name3'
foo: 2
bar: 444
}];

我希望返回按 foo 分组的结果,键应该是 foo 的变量/数字:

[{
'1': [{
name: 'Name1'
bar: 222
}, {
name: 'Name2'
bar: 333
}],
'2': [{
name: 'Name3'
bar: 444
}]
}]

我正在尝试使用聚合,但我永远无法将 _id 替换为“Foo 的数量”。

Mongoose 也能做到这一点吗?还是我需要在 Nodejs 函数中编辑对象?

最佳答案

您可以尝试以下聚合:

db.col.aggregate([
{
$group: {
_id: "$foo",
obj: { $push: { name: "$name", bar: "$bar" } }
}
},
{
$replaceRoot: {
newRoot: {
$let: {
vars: { obj: [ { k: {$substr:["$_id", 0, -1 ]}, v: "$obj" } ] },
in: { $arrayToObject: "$$obj" }
}
}
}
}
])

输出:

{ "2" : [ { "name" : "Name3", "bar" : 444 } ] }
{ "1" : [ { "name" : "Name1", "bar" : 222 }, { "name" : "Name2", "bar" : 333 } ] }

$replaceRoot允许您在根级别定义新对象。要动态创建 key ,您需要 $arrayToObject它采用一组 k-v 对(此处使用 $let 定义)。要将 int 转换为字符串,您可以使用 trick使用 $substr ({$substr:["$foo", 0, -1 ]}) 或 $toString MongoDB v 4.0 中的运算符

关于mongodb - Mongoose 按字段分组和分组结果应存储为 groupname : object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448196/

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