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
    ,它将检查
    createdBy
    是否匹配返回1,否则返回0
  • $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),
]);