如何查询和排序 Mongoose 子文档

Posted

技术标签:

【中文标题】如何查询和排序 Mongoose 子文档【英文标题】:How to query and sort Mongoose subdocuments 【发布时间】:2021-07-19 12:27:04 【问题描述】:

我需要在deck 中获取card,它具有最低的stats.reviewDate 值。

例如,对此的查询:


    "_id": "608642db80a36336946620aa",
    "cards": [
        
            "stats": 
                "reviewDate": "1985-03-26T04:34:17.425Z",
            ,
            "_id": "6086430080a36336946620ab",
            "front": "front",
            "back": "back"
        ,
        
            "stats": 
                "reviewDate": "2021-05-26T04:34:17.425Z",
            ,
            "_id": "6086430080a36336946620ab",
            "front": "front",
            "back": "back"
        ,
        
            "stats": 
                "reviewDate": "2021-04-26T04:34:17.425Z",
            ,
            "_id": "6086430080a36336946620ab",
            "front": "front",
            "back": "back"
        
    ]

应该返回:

       
            "stats": 
                "reviewDate": "1985-03-26T04:34:17.425Z",
            ,
            "_id": "6086430080a36336946620ab",
            "front": "front",
            "back": "back"
        

我试图通过按降序对卡片进行排序并读取列表中的第一项来实现这一点:

 DeckModel.findById(req.params.deckId, 'cards')
  .sort('cards.stats.dateCreated': 'desc')
  .exec((err, docs) => 
    if(err)  return next(err) 
    console.log(docs.cards.[0]);
  );

但它不起作用——当然是因为我对 .sort()) 的理解很差

Here 是一个与我类似的问题,尽管它没有被接受的答案。

如何构造一个返回我想要的结果的查询?

如果需要,这是我的架构:

    var DeckSchema = new Schema ( 
      
        title:  type: String, required: true, maxlength: 255 ,
        cards: [CardSchema]
      
    )
    var CardSchema = new Schema(
      
        stats: 
          reviewDate: type: Date, default: Date.now(), required: true,
        ,
        front: String,
        back: String
      
    )

谢谢大家,

酸牙

【问题讨论】:

【参考方案1】:

演示 - https://mongoplayground.net/p/RUssJuB7XO2

db.collection.aggregate([
  //  $match:    , your query here
   $unwind: "$cards" ,
   $sort:  "cards.stats.dateCreated": -1  ,
   $limit: 1 ,
   $replaceRoot:  "newRoot": "$cards"  
])

【讨论】:

非常感谢您的回答!它确实有帮助。如果你有时间,可以看看我的new question 查询吗?我真的很感激。

以上是关于如何查询和排序 Mongoose 子文档的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将子文档插入 mongo 集合?

如何将子文档插入 mongo 集合?

如何使用另一个集合 mongoose 查找子查询文档

为啥 Mongoose ORM 选择不使用常规的 mongo 语法进行查找、排序等?

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