对 mongoose 3.x 填充文档进行排序的正确语法

Posted

技术标签:

【中文标题】对 mongoose 3.x 填充文档进行排序的正确语法【英文标题】:The correct syntax for sorting mongoose 3.x populated document 【发布时间】:2015-02-03 18:06:34 【问题描述】:

我在 1:1 关系中有两个 MongoDB 集合 CustomerUser。我正在尝试使用Mongoose Population 查询这两个文档并按User.name 对其进行排序。

下面没有任何工作。我的猫鼬是 3.8.19。

Customer
    .find()
    .populate("user", "name email phone")
    .sort( "name": 1 )
    .exec()

Customer
    .find()
    .populate("user", "name email phone", null,  sort:  'name': 1   )
    .exec()

Customer
    .find()
    .populate(
        path: "user",
        select: "name email phone",
        options:  sort:  "name": 1 
    ).
    exec()

Customer
    .find()
    .populate(
        path: "user",
        select: "name email phone",
        options:  sort: [ "name": 1 ]
    )
    .exec()

我找到了How to sort a populated document in find request?,但没有成功。

在 SQL 中会像下面这样:

SELECT customer.*, user.name, user.email, user.phone FROM customer 
JOIN user ON customer.user_id = user.id
ORDER BY user.name ASC

【问题讨论】:

您无法在填充字段上对文档进行排序。 ***.com/questions/19428471/… 【参考方案1】:

我不知道为什么人们说你不能对填充的字段进行排序....

model.findOne(name: request.params.posts)
    .populate('messages', '_id message createDate', null,  sort:  'createDate': -1  )
    .exec(function(error, results) 
)

我的模型“发布”的地方有一个 ObjectID 消息数组,在这里填充并按其 createDate 排序。效果很好。

【讨论】:

它可能会按每个帖子而不是所有结果对消息进行排序。您的解决方案与我的第二个示例非常相似,该示例无法按填充文档对整个结果进行排序。 我不知道为什么这被否决了。这个答案有效。不要忘记添加null,否则将不起作用。【参考方案2】:

感谢@JohnnyHK in comment,无法对 MongoDB 和 Moongose 中的填充字段进行排序。 The only option is to sort the entire array of results manually.

Mongo 没有连接。对填充文档进行排序的唯一方法是 todo 收到所有结果后手动进行。

我通过使用 Array.sort([compareFunction]) 对 Mongoose 查询的输出进行排序来解决这个问题。但是,在对大量数据进行排序时,它可能会对性能产生很大影响。

作为一个侧节点,我正在考虑使用 node.js 迁移到关系数据库。

【讨论】:

以上是关于对 mongoose 3.x 填充文档进行排序的正确语法的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Mongoose 查询对嵌入文档数组进行排序?

Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性

MongoDB/Mongoose:在填充字段中排序

在 Mongoose 中对子文档进行排序

Mongoose 查找 array.length 大于 0 的所有文档并对数据进行排序

使用mongoose在mongodb中按升序和降序对多个字段进行排序