要实现您描述的查询,我们可以使用 MongoDB 的聚合管道。以下是一个示例的 MongoDB 聚合查询,它符合您的需求:
db.collection.aggregate([
// 过滤条件
{
$match: {
hobby: { $in: ["篮球", "足球", "排球"] },
tall: 100
}
},
// 根据 name 字段分组,计算 count 和合并 location 字段
{
$group: {
_id: "$name",
hobby: { $first: "$hobby" },
tall: { $first: "$tall" },
location: { $push: "$location" }, // 把所有相同 name 的 location 收集到数组中
count: { $sum: 1 } // 记录相同 name 的记录个数
}
},
// 合并 location 字段,以逗号分隔
{
$project: {
_id: 1,
name: "$_id",
hobby: 1,
tall: 1,
location: { $reduce: {
input: "$location",
initialValue: "",
in:
{ $cond:
[{ $eq: ["$$value", ""] }, "$$this", { $concat : ["$$value", ", ", "$$this"] }]
}
}},
count: 1
}
},
// 排序根据 last_time 字段从大到小排序(假设 last_time 是集合中的字段)
{
$sort : { last_time : -1 }
},
// 添加偏移和限制,skip 为 offset, limit 为 limit
{
$skip : 15
},
{
$limit : 100
}
]);
查询步骤说明:
- $match:首先匹配
hobby
在指定值之内,并且tall
等于 100。 - $group:通过
name
字段进行分组,收集其他需要的数据,包括使用$push
收集所有location
值和计数。 - $project:将所有的
location
值连接为一个字符串,同时保持其他需要的字段。 - $sort:根据
last_time
字段进行降序排序(确保您在文档中有该字段)。 - $skip 和 $limit:用于分页处理,跳过前15条记录并限制返回100条记录。
请替换 collection
为您的实际集合名称。这种方法有效地满足了您对数据的需求。
内容由零声教学AI助手提供,问题来源于学员提问