【问题标题】:Sort with mongo and return specific objectId´s first使用 mongo 排序并首先返回特定的 objectId
【发布时间】:2020-09-26 07:16:20
【问题描述】:

这样的结构://(简化的id)

用户:

{_id : ObjectId("4"), name: "Max Sampleman"}
{_id : ObjectId("5"), name: "Jon Doe"}

书籍:

{_id : ObjectId("1"), title: "MongoDB Overview", "likes": 3, contributor: ObjectId("5") }
{_id : ObjectId("2"), title: "NoSQL Overview", "likes": 2, contributor: ObjectId("4")}
{_id : ObjectId("3"), title: "Tutorials Point Overview", "likes": 6, contributor: ObjectId("5")}

现在我正在寻找一种方法来查找书籍,sort 按赞,但首先返回来自用户 4 的书籍。

这样的方法似乎行不通:

user4 = await User.findById(4)

books.find({}).sort({contributor: user4.id, likes: -1})

它返回一个错误,说:

"message": "无效排序值:{ 贡献者:4 }"

有没有办法实现这种排序?

【问题讨论】:

  • 您可以在单个查询中完成。 books.find({contributor:user4.id}, null, {sort: {likes: -1}}).then().catch() 确保 user4.id 不为 ObjectID 类型的空值。

标签: javascript node.js mongodb sorting mongoose


【解决方案1】:

sort 允许的值为asc, desc, ascending, descending, 1, and -1,因此您将无法传递 id 而不是这些值。

实现您的要求的一种方法是使用aggregate$set,您可以添加一个新字段并将其设置为true,以获取您需要首先获取的特定id,并在其中使用该字段排序。

books.aggregate([
    { $set: { priority: { $eq: ["$contributor", user4.id] } } },
    { $sort: { priority: -1, likes: -1 } },
  ]);;

【讨论】:

  • 附加问题。这与执行两个普通(非聚合)查询相比如何?第一个查询获取贡献者的书籍,第二个查询非贡献者并最终合并它们?这当然不是理想的,但只是出于好奇
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
相关资源
最近更新 更多