在聚合中“加入”一个集合

时间:2017-07-18 16:46:37

标签: mongodb lookup aggregation

获得以下收藏:

db.test.insert({ "DateID" : 2084, "DBFileID" : 105657, "Size_MB" : 1427 });
db.test.insert({ "DateID" : 2085, "DBFileID" : 105657, "Size_MB" : 1427 });
db.test.insert({ "DateID" : 2086, "DBFileID" : 105657, "Size_MB" : 1427 });
db.test.insert({ "DateID" : 2087, "DBFileID" : 105657, "Size_MB" : 1427 });
db.test.insert({ "DateID" : 2088, "DBFileID" : 105657, "Size_MB" : 1427 } );
db.test.insert({ "DateID" : 2084, "DBFileID" : 105658, "Size_MB" : 3873 });
db.test.insert({ "DateID" : 2085, "DBFileID" : 105658, "Size_MB" : 3878 });
db.test.insert({ "DateID" : 2086, "DBFileID" : 105658, "Size_MB" : 3881 });
db.test.insert({ "DateID" : 2087, "DBFileID" : 105658, "Size_MB" : 3882 });
db.test.insert({ "DateID" : 2088, "DBFileID" : 105658, "Size_MB" : 3883 } );
db.test.insert({ "DateID" : 2084, "DBFileID" : 105659, "Size_MB" : 3134 });
db.test.insert({ "DateID" : 2085, "DBFileID" : 105659, "Size_MB" : 3134 });
db.test.insert({ "DateID" : 2086, "DBFileID" : 105659, "Size_MB" : 3134 });
db.test.insert({ "DateID" : 2087, "DBFileID" : 105659, "Size_MB" : 3134 });
db.test.insert({ "DateID" : 2088, "DBFileID" : 105659, "Size_MB" : 3134 } );
db.test.insert({ "DateID" : 2084, "DBFileID" : 105660, "Size_MB" : 1149 });
db.test.insert({ "DateID" : 2085, "DBFileID" : 105660, "Size_MB" : 1149 });
db.test.insert({ "DateID" : 2086, "DBFileID" : 105660, "Size_MB" : 1149 });
db.test.insert({ "DateID" : 2087, "DBFileID" : 105660, "Size_MB" : 1149 });
db.test.insert({ "DateID" : 2088, "DBFileID" : 105660, "Size_MB" : 1049 } );
db.test.insert({ "DateID" : 2084, "DBFileID" : 105661, "Size_MB" : 107159 });
db.test.insert({ "DateID" : 2085, "DBFileID" : 105661, "Size_MB" : 107159 });
db.test.insert({ "DateID" : 2086, "DBFileID" : 105661, "Size_MB" : 107159 });
db.test.insert({ "DateID" : 2087, "DBFileID" : 105661, "Size_MB" : 107159 });
db.test.insert({ "DateID" : 2088, "DBFileID" : 105661, "Size_MB" : 107159 });

然后检索每个DBFileID的最高DateID:

MongoDB Enterprise > db.test.aggregate([ { $group: {_id: "$DBFileID",lastDate: { $last: "$DateID" }}}])
{ "_id" : 105661, "lastDate" : 2088 }
{ "_id" : 105657, "lastDate" : 2088 }
{ "_id" : 105660, "lastDate" : 2088 }
{ "_id" : 105658, "lastDate" : 2088 }
{ "_id" : 105659, "lastDate" : 2088 }

这里是我想要的结果集:

{ "DateID" : 2088, "DBFileID" : 105657, "Size_MB" : 1427 }
{ "DateID" : 2088, "DBFileID" : 105658, "Size_MB" : 3883 }
{ "DateID" : 2088, "DBFileID" : 105659, "Size_MB" : 3134 }
{ "DateID" : 2088, "DBFileID" : 105660, "Size_MB" : 1049 }
{ "DateID" : 2088, "DBFileID" : 105661, "Size_MB" : 107159 }

即。检索每个DBFileID,其Size_MB为最高DateID ...

我试图在单个聚合+查询查询中得到这个,但无济于事......

有人可以帮助我吗?

事先,谢谢! 问候, SEB

1 个答案:

答案 0 :(得分:0)

  1. DateID降序排列文档
  2. DBFieldID对文档进行分组,并从每个组中选择第一个文档(这将是一个最大DateID值的文档
  3. 项目结果以获取您想要的字段
  4. 查询:

    db.test.aggregate([
      { $sort: { DateID: -1 }},
      { $group: {_id: "$DBFileID", doc: { $first: "$$ROOT" }}},
      { $project: { _id:0, DBFieldID: "$_id", DateID: "$doc.DateID", Size_MB: "$doc.Size_MB" }}
    ]);
    

    输出:

    { "DBFieldID" : 105661, "DateID" : 2088, "Size_MB" : 107159 }
    { "DBFieldID" : 105660, "DateID" : 2088, "Size_MB" : 1049 }
    { "DBFieldID" : 105659, "DateID" : 2088, "Size_MB" : 3134 }
    { "DBFieldID" : 105658, "DateID" : 2088, "Size_MB" : 3883 } 
    { "DBFieldID" : 105657, "DateID" : 2088, "Size_MB" : 1427 }