Mongodb 对记录进行排序,以便只将与id匹配的记录排在第一位?
我有一个查询,返回特定场景的记录或消息:Mongodb 对记录进行排序,以便只将与id匹配的记录排在第一位?,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有一个查询,返回特定场景的记录或消息: const [messages, messageCount] = await Promise.all([ MessageModel.find(params).select(filterObject).limit(ctx.query.limit).skip(ctx.paginate.skip) .sort('-sex -age') .lean(), MessageModel.countDocuments(params
const [messages, messageCount] = await Promise.all([
MessageModel.find(params).select(filterObject).limit(ctx.query.limit).skip(ctx.paginate.skip)
.sort('-sex -age')
.lean(),
MessageModel.countDocuments(params),
]);
有没有办法先获取与对象id匹配的记录,然后再获取其余记录
结果
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is stark"
gender:"unisex"
age: "19"
createdBy:abcff9ef71fa048cea3c8a97
}
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is james"
gender:"unisex"
age: "20"
createdBy:defff9ef71fa048cea3c8a97
}
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is harry"
gender:"unisex"
age: "20"
createdBy:defff9ef71fa048cea3c8a97
}
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is max"
gender:"unisex"
age: "20"
createdBy:abcff9ef71fa048cea3c8a97
}
现在我想要那些由abc创建的消息。。。第一。所有与某个id匹配的记录将首先出现,然后其余记录将保持不变
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is stark"
gender:"unisex"
age: "19"
createdBy:abcff9ef71fa048cea3c8a97
}
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is max"
gender:"unisex"
age: "20"
createdBy:abcff9ef71fa048cea3c8a97
}
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is james"
gender:"unisex"
age: "20"
createdBy:defff9ef71fa048cea3c8a97
}
{
_id:abc0aa8573bfa917b152cdbc
isPrivate:false
message:"My name is harry"
gender:"unisex"
age: "20"
createdBy:defff9ef71fa048cea3c8a97
}
我不认为有任何直接的方法可以做到这一点,如果你真的想尝试
$cond
操作符来检查特定字段的条件
- 在
中添加新字段$project
,它将检查matchResult
是否匹配返回1,否则返回0createdBy
按$sort
降序排列matchResult
第二个选项是从MongoDB v4.2开始的聚合运算符 我不推荐这种方法用于收集大数据,这可能会导致性能问题,最好在查询后在客户端进行排序
您的问题不清楚,您的匹配条件是什么?根据您的文档和输入匹配条件,提供有关当前输出和预期结果的更多详细信息。参数通常包含筛选器和两个id,即用户id和workbase id。我通常通过该参数获取所有消息。我现在想要的是,我想先获取与某个用户id相关的所有消息,然后获取其余的消息messages@turivishal我现在添加了一些伪数据。无效的$project::由::导致的::无法在排除投影中使用除$meta以外的表达式:(这可能是
filterObject
中的问题,它是对象吗?只需将其作为对象传递,看看我在回答中添加的问题:为什么在客户端排序比在服务器端通过聚合进行排序更好?我们有没有关于与某些操作符建立聚合管道的影响的文章?这类操作操作可能会导致性能问题,因为我们在查询中生成字段并对其进行操作,它永远不会使用索引查看如何优化查询查看,如果您真的想学习mongodb,我建议您尝试mongodb大学的mongodb
const [messages, messageCount] = await Promise.all([
MessageModel.aggregate([
{ $match: params },
{
$project: {
...filterObject,
matchResult: {
$cond: [
{ $eq: ["$createdBy", ObjectId("abcff9ef71fa048cea3c8a97")] },
1,
0
]
}
}
},
{ $sort: { matchResult: -1 } },
{ $skip: ctx.paginate.skip },
{ $limit: ctx.query.limit }
]),
MessageModel.countDocuments(params),
]);