2017-09-05 69 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