node.js - 每个用户只获取一个文档 - mongoDB
问题描述
我坚持使用 mongo 聚合查询。现在我有一个集合,其中包含各种用户的帖子(其详细信息存在于用户集合中)。
我需要一个查询来获取每个用户的一个帖子(如 SQL 中的 group by)
POSTS 收集数据
{
language:'english',
status:'A',
desc:'Hi there',
userId:'5b891370f43fe3302bbd8918'
},{
language:'english',
status:'A',
desc:'Hi there - 2'
userId:'5b891370f43fe3302bbd8918'
},{
language:'english',
status:'A',
desc:'Hi there - 3'
userId:'5b891370f43fe3302bbd8001'
}
这是我的查询
db.col('posts').aggregate([
{
$match: {
language: 'english',
status: "A"
}
}, {
$sample: { size: 10 }
}, {
$sort: { _id: -1 }
}, {
$lookup: {
from: 'users',
localField: 'userId',
foreignField: '_id',
as: 'ownerData'
}
}], (err, data) => { console.log(err,data) });
期望的输出
{
language:'english',
status:'A',
desc:'Hi there',
userId:'5b891370f43fe3302bbd8918',
ownerData:[[object]]
},{
language:'english',
status:'A',
desc:'Hi there - 3'
userId:'5b891370f43fe3302bbd8001',
ownerData:[[object]]
}
解决方案
$group:将作为 mysql 的 group by。$first:将从组中获取集合字段的第一个元素。$lookup充当 mysql 中的连接。
db.tempdate.aggregate([
{ $group :
{
_id : "$userId",
language : { $first: '$language' },
status : { $first: '$status' },
desc : { $first: '$desc' }
}
},
{ $lookup:
{
from: "user",
localField: "_id",
foreignField: "user_id",
as: "userData"
}
}
]).pretty();`
Output
`{
"_id" : "5b891370f43fe3302bbd8001",
"language" : "english",
"status" : "A",
"desc" : "Hi there - 3",
"userData" : [
{
"_id" : ObjectId("5ba3633a12b8613823f3056e"),
"user_id" : "5b891370f43fe3302bbd8001",
"name" : "Bhuwan"
}
]
}
{
"_id" : "5b891370f43fe3302bbd8918",
"language" : "english",
"status" : "A",
"desc" : "Hi there",
"userData" : [
{
"_id" : ObjectId("5ba3634612b8613823f3056f"),
"user_id" : "5b891370f43fe3302bbd8918",
"name" : "Harry"
}
]
}
推荐阅读
- javascript - 为什么使用javascript单击心形按钮时没有动作?
- javascript - Html2Canvas:如何获取 dom 元素的中心部分
- r - 抖动图到气泡图,更多点时更大的气泡,r
- android - 在 Android 自定义视图中裁剪 Path 对象
- django - Docker-compose(和 django):无法将环境变量添加到服务中
- c# - Azure 函数将事件发布到具有相同事件中心名称但不同连接字符串的多个事件中心
- excel - Excel 计算输入预测的前 24 个月的偏差
- python - 用 Python 在矩阵中取元素
- gnuplot - Gnuplot 不弹出标题(或图例)
- groovy - groovy中的杰克逊版本冲突