我有以下设计架构:
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]
}]
}
感谢您的帮助!
答案 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 }
}
}
}
])