2017-09-05 79 views
0

以下结构简单(post.comments)的MongoDB:检索,筛选和排序MongoDB的嵌入式集合

{ 
"_id" : ObjectId("59acf254af58fa08ecbb4389"), 
"title" : "no title", 
"total_comments" : 4874, 
"comments" : [ 
    { 
     "_id" : ObjectId("59acf275af58fa08ecbb4399"), 
     "timestamp" : ISODate("2017-09-04T06:28:05.238Z"), 
     "body" : "Dummy Comment Title", 
    }, 
    { 
     "_id" : ObjectId("59acf275af58fa08ecbb439f"), 
     "timestamp" : ISODate("2017-09-04T06:28:05.488Z"), 
     "body" : "Dummy Comment Title", 
    }, 
    { ... thousand comments more ... } 
], 

抓取的帖子,并忽略由于海量数据评论:

BGStream stream = await db.Streams 
      .Find(m => m.Id == new ObjectId(id)) 
      .Project<BGStream>(Builders<BGStream>.Projection 
       .Exclude(m => m.Comments)) 
      .FirstOrDefaultAsync(); 

抓取缺少通过AJAX评论(不是一个很好的解决方案):

var filter = Builders<BGStream>.Filter.Eq("_id", new ObjectId(id)); 
var projection = Builders<BGStream>.Projection 
      .Include(m => m.Comments).Slice("comments", skip: skip, limit: take); 
var stream = await db.Streams 
    .Find(filter).Project<BGStream>(projection) 
    .FirstOrDefaultAsync(); 

问题: 我不知道如何通过时间戳对评论集合进行排序。我必须先取得最新的评论,但查询给了我最早的评论。

我在这里失踪了什么?

+1

如果你有成千上万的,你在你的问题中提到的意见,我建议想关于分割您的文档并将注释转移到单独的集合中。这将给你更多的自由提取意见和重建文件他们想要的方式。请参阅文档中的$ lookup' – Saleem

+0

已经考虑过了,但如果我拆分它,CRUD操作很难实现。删除链等... – creality

+0

要实现额外的集合。 Thx Saleem。 – creality

回答

1

$unwind操作使用聚合如下

db.collection_name.aggregate([ 
    { 
     "$unwind" : "$comments" 
    }, 
    { 
     "$sort" : { 
      "comments.timestamp" : -1 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : null, 
      "comments" : { 
       "$push" : "$comments" 
      } 
     } 
    } 
]) 

您可以使用$limit限制评论的数量

+0

这是一个可行的解决方案,但在调用$ unwind之后,我必须处理匿名BSONObjects。 Saleem上面提到的,我认为最好将其存储在额外的收藏集中。 – creality