【问题标题】:Mongodb : How to position object to first place in sorted arrayMongodb:如何将对象定位到排序数组中的第一位
【发布时间】:2020-02-05 19:49:23
【问题描述】:

我有以下数据:

answer: {
    questionid: Objectid(something),
    answers: [
      {
        user: { type: Schema.Types.ObjectId },
        isTrue: {
          type: Boolean,
          default: false
        },
        date: {
          type: Date,
          default: Date.now
        }
      }
    ]
  }

我如何查询才能得到答案:结果为真,其余的结果按日期排序

编辑:我想要的是检查任何答案是否正确,如果是的话,将其推高,所有其他不正确的答案将按日期排序。把它想象成stackoverflow问题。如果答案被标记为 true,我希望它一直向上,就在问题的下方,如果不是 true,则按日期排序。

【问题讨论】:

  • 您能否在问题中添加一些完整的示例文档作为 json,并描述预期的输出?
  • 可以显示从 mongodb 获取数据的代码吗?
  • 刚刚添加了一些解释,如果您需要其他任何内容,请告诉我@SuleymanSah

标签: node.js reactjs mongodb


【解决方案1】:

您可以通过聚合来执行此操作,展开您的答案数组并对答案 isTrue 为 -1 进行排序,因为您首先希望为 true,然后按日期为 -1 进行排序(降序)

db.getCollection('test').aggregate([
   {$unwind: "$answers"}, 
   {$sort: {"answers.isTrue": -1, "answers.date": -1}},
   {$group: {_id:"$_id", answers: {$push:"$answers"}}}
])

【讨论】:

    【解决方案2】:

    您可以使用sort() 对 mongodb 中的数据进行排序。在你的情况下,它会像:

    collection.find().sort({answers.answer: -1, answere.date: -1})
    

    -1 按降序对您的数据进行排序。

    编辑:按问题更改时添加的日期排序。

    【讨论】:

    • 刚刚更新了我的代码。我想要的是检查是否有任何答案是真的,如果是的话,把它推上去,所有其他不正确的答案将按日期排序
    • 在这种情况下,您需要先使用 answere:true 推送数据,然后休息,您可以在推送同一数组后按 if 条件中的数据对数据进行排序
    • @SavanPadaliya 正确阅读了问题,他想用答案和日期进行排序。
    • @AshutoshSharma 为了您的友好信息,我在问题更新之前发布了这个答案。之后你回答了所以没有更新我的答案
    • @SavanPadaliya 好的
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2014-10-14
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多