从 MongoDB query/aggregation 管道创建特定形状的结果
Create results of a specific shape from MongoDB query/aggregation pipeline
考虑这个模型:
const user = {
firstname: { type: String, default: '' },
lastname: { type: String, default: '' },
goals: { type: Number, default: 0 },
};
还有这个合集:
[{
id: 1,
firstname: 'paul',
lastname: 'pogba',
goals: 2,
},
{
id: 2,
firstname: 'fred',
lastname: '',
goals: 2,
},
{
id: 3,
firstname: '',
lastname: 'rashford',
goals: 5,
},
{
id: 4,
firstname: 'luke',
lastname: 'shaw',
goals: 0,
}]
我想执行一个查询(我想它需要是一个聚合管道)returns一个数组,其中每个匹配文档中的每个可用名称都是数组中的一个条目。因此,使用上面的示例,假设我想让用户有 1 个或多个目标。 query/aggregation 管道的最终输出将是:
['paul', 'pogba', 'fred', 'rashford']
注意
- 排除空字符串,
- 如果在给定文档中都可用,则两个名称都包括在内
luke shaw
的名字被排除在外,因为 luke shaw 不匹配(进球少于 1 个)。
我什至不确定 MongoDB 使用的是什么术语,所以也许这就是我找不到正确答案的原因。
我怎样才能做到这一点?谢谢!
$match
goals
大于 0
$group
所有文件并准备firstname
和lastname
数组
$project
生成一个 result
数组,$filter
在使用 $concatArrays
连接 firstname
和 lastname
之后迭代数组循环, 这将删除空字符串
来自数组和 concat 的单个结果
db.collection.aggregate([
{ $match: { goals: { $gt: 0 } } },
{
$group: {
_id: null,
firstname: { $push: "$firstname" },
lastname: { $push: "$lastname" }
}
},
{
$project: {
_id: 0,
result: {
$filter: {
input: { $concatArrays: ["$firstname", "$lastname"] },
cond: { $ne: ["$$this", ""] }
}
}
}
}
])
考虑这个模型:
const user = {
firstname: { type: String, default: '' },
lastname: { type: String, default: '' },
goals: { type: Number, default: 0 },
};
还有这个合集:
[{
id: 1,
firstname: 'paul',
lastname: 'pogba',
goals: 2,
},
{
id: 2,
firstname: 'fred',
lastname: '',
goals: 2,
},
{
id: 3,
firstname: '',
lastname: 'rashford',
goals: 5,
},
{
id: 4,
firstname: 'luke',
lastname: 'shaw',
goals: 0,
}]
我想执行一个查询(我想它需要是一个聚合管道)returns一个数组,其中每个匹配文档中的每个可用名称都是数组中的一个条目。因此,使用上面的示例,假设我想让用户有 1 个或多个目标。 query/aggregation 管道的最终输出将是:
['paul', 'pogba', 'fred', 'rashford']
注意
- 排除空字符串,
- 如果在给定文档中都可用,则两个名称都包括在内
luke shaw
的名字被排除在外,因为 luke shaw 不匹配(进球少于 1 个)。
我什至不确定 MongoDB 使用的是什么术语,所以也许这就是我找不到正确答案的原因。
我怎样才能做到这一点?谢谢!
$match
goals
大于 0$group
所有文件并准备firstname
和lastname
数组$project
生成一个result
数组,$filter
在使用$concatArrays
连接firstname
和lastname
之后迭代数组循环, 这将删除空字符串 来自数组和 concat 的单个结果
db.collection.aggregate([
{ $match: { goals: { $gt: 0 } } },
{
$group: {
_id: null,
firstname: { $push: "$firstname" },
lastname: { $push: "$lastname" }
}
},
{
$project: {
_id: 0,
result: {
$filter: {
input: { $concatArrays: ["$firstname", "$lastname"] },
cond: { $ne: ["$$this", ""] }
}
}
}
}
])