Mongoose Mongodb 子文档的排序和限制查询

Posted

技术标签:

【中文标题】Mongoose Mongodb 子文档的排序和限制查询【英文标题】:Mongoose Mongodb sorting and limiting query of subdocuments 【发布时间】:2015-12-20 16:17:49 【问题描述】:

我有以下设计架构:

 
      participants: [String],
      conversations: [
          date: Date
          messages: [String]
      ]
 

现在我想获得 6 个最新的对话。我已经尝试了很多,但我似乎无法找到解决方案。我可以按子文档排序,但最后如果 1 个文档有 6 个最新的对话,则查询最终会给我这个文档加上 5 个其他文档。我想在查询结束时得到一个这样的数组,或者能够得到这个特定的信息:

[date:'Adate', messages:[],date:'Adate2',messages:[]]

感谢您的帮助!

【问题讨论】:

【参考方案1】:

实际上,如果您使用的 mongoDB 版本低于 3.1.6,则使用单个查询是不可能的。

mongoDB version 3.1.6 and above 中的聚合管道支持$Slice

如果您的 mongoDB 版本低于 3.1.6,那么您可以尝试以下代码:

db.collection.aggregate([
 $unwind : "conversations",
 $sort : _id : 1, conversations.date : -1,
 $group:  _id : "$_id" , conversations :  $push : "$conversations", participants : $first : "$participants" ,
 $project :   _id : 1, conversations : 1, participants : 1  
]).forEach( function(doc)
                 

                    if( doc.conversations.length > 6)
                    
                        var count = doc.conversations.length - 6;
                        doc.conversations.splice(6, count );
                    
                
            )

3.1.6以下版本的***上有类似的问题,请查看the link。

对于mongoDb Version 3.1.6 and above,可以在聚合管道中使用$Slice来限制数组的内容。

试试下面的代码:

db.collection.aggregate([
 $unwind : "conversations",
 $sort : _id : 1, conversations.date : -1,
 $group:  _id : "$_id" , conversations :  $push : "$conversations", participants : $first : "$participants" ,
 $project :  
                 
                    _id : 1, 
                    participants : 1, 
                    newconversations : 
                                         
                                            conversations :  $slice : 6  
                                         
                 

])

【讨论】:

谢谢你,很抱歉迟到了,正在出差。

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

MongoDB/Mongoose - 与 geoNear 和子文档的聚合

基于多个子文档的MongoDB/Mongoose查询

MongoDB:如何使用 Mongoose 添加或更新子文档?

使用 mongoose 从 Mongodb 中删除子文档

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?