Mongoose 填充排序选项

Posted

技术标签:

【中文标题】Mongoose 填充排序选项【英文标题】:Mongoose populate sort option 【发布时间】:2018-11-30 22:44:35 【问题描述】:

我正在尝试按填充字段对填充文档进行排序,类似于 mongoose 文档中的示例:

http://mongoosejs.com/docs/api.html#query_Query-populate

其中 Kitten 通过 objectId 引用所有者,并且对 Kitten 的查询可以按所有者名称排序。我尝试了多种语法变体,例如

中给出的答案

How to sort a populated document in find request?

虽然它们都已填充并且不会引发任何错误,但排序选项对我不起作用。这里给出了我尚未尝试过的一种解决方案:

Mongoose, sort based on foreign/populated key

但不使用从 mongoose 填充的可用功能,感觉就像一个变通方法。也许一双新鲜的眼睛可以指出我的问题。

我的模型(学期和学期参考):

var semesterSchema = mongoose.Schema(
  year: Number,
  season: 
type: String,
enum: ["FALL", "SPRING", "SUMMER"]
  
);

var semesterReferenceSchema = mongoose.Schema(
  name: String,
  semester: type: mongoose.Schema.Types.ObjectId, ref:"Semester"
);

我使用此代码查询时的结果

schema.SemesterReference.find().populate(path: "semester", options: sort: "year": 1).exec().then(function(result)
console.log(result);
)

[  _id: 5b2bb2312731613ba06b0e8f,
name: 'ZZZ',
semester:
  _id: 5b23bd1e0ffe9a29d02ee02c,
   year: 2019,
   season: 'SPRING',
   __v: 0 ,
__v: 0 ,
 _id: 5b2bb24b3c19bd1f3c1b0d66,
name: 'AAA',
semester:
  _id: 5b23bd1e0ffe9a29d02ee011,
   year: 2010,
   season: 'SPRING',
   __v: 0 ,
__v: 0  ]

查询返回的结果与我根本没有在选项中指定按年份排序一样。我在学期或一年左右尝试了相同的查询,但没有引号,这也不起作用。令人担忧的是,将上面查询中的“年份”更改为与学期属性不匹配的字符串(例如 asdf)不会引发任何错误,并且查询会正常返回,这似乎表明排序选项被忽略了。

我使用的是 mongoose 5.1.6 版和 mongodb 3.6.0 版。

【问题讨论】:

您的查询按升序返回年份...这里有什么问题? Sort: 1 表示按升序排序,我的查询是按照它们保存到数据库的顺序返回它们(顺序不正确,也恰好是降序;2010 年之前的 2019 是降序) . 您使用的是最新版本的 mongoose 和 mongodb,所以您想尝试一些不同的东西吗?我的意思是$lookup 我现在将使用查找,从我上面链接的答案:基于外部填充键排序,只是为了让它工作。但我仍然想弄清楚为什么 populate 对我不起作用,因为官方文档有一个明确的例子说明它有效,而且我所做的研究似乎并没有表明官方文档是错误的。 【参考方案1】:

您的第一个两个来源都使用了一个参考数组。如您的 first source 所述:

'sort' 适用于 Author 模型,而不是 Book 模型。

在您的示例中,您的semesterReferenceSchema 中需要一个semesters 数组。比你可以按年份对数组进行排序。

【讨论】:

以上是关于Mongoose 填充排序选项的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Mongoose.js:强制总是填充

在填充中排序不起作用(猫鼬)

尝试加入两个文档时无法在 Mongoose 中填充路径