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

时间:2015-09-23 11:11:22

标签: mongodb

我有以下设计架构:

function uploadImage($imageName)
{
    if(!isset($imageName)){
       die('Image is Missing!');
    } else {
      //uploading code continuous...
    }
}

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

实际上,如果您使用的是比3.1.6更低的mongoDB版本,则无法使用单个查询。

$ {3}}

中的聚合管道支持切片

如果您的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以下的版本,StackOverflow上存在类似的问题,请检查mongoDB version 3.1.6 and above

对于the link,您可以在聚合管道中使用$ 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 } 
                                        } 
                } 
}
])