【问题标题】:Transforming SQL query to mongo using aggregate framework使用聚合框架将 SQL 查询转换为 mongodb
【发布时间】:2026-01-11 13:00:02
【问题描述】:

我的 mongo 集合中有以下数据。

db.tempTest.insert([{
  "id"   : "12345",
  createdOn : ISODate("2016-09-15T19:25:00.000Z"),
  "addr" : "address1",
  "book" : "book1"
}, {
  "id"   : "12345",
  createdOn : ISODate("2016-09-14T19:25:00.000Z"),
  "addr" : "address2",
  "book" : "book2"
}, {
  "id"   : "12346",
  createdOn : ISODate("2016-09-15T19:26:00.000Z"),
  "addr" : "address3",
  "book" : "book3"
}, {
  "id"   : "12346",
  createdOn : ISODate("2016-09-15T19:26:01.000Z"),
  "addr" : "address4",
  "book" : "book4"
}, {
  "id"   : "12346",
  createdOn : ISODate("2016-09-14T19:26:01.000Z"),
  "addr" : "address5",
  "book" : "book5"
}, {
  "id"   : "12347",
  createdOn : ISODate("2016-09-14T19:26:01.000Z"),
  "addr" : "address6",
  "book" : "book6"
}, {
  "id"   : "12347",
  createdOn : ISODate("2016-09-10T19:26:01.000Z"),
  "addr" : "address7",
  "book" : "book7"
}, {
  "id"   : "12345",
  createdOn : ISODate("2016-09-14T19:25:00.000Z"),
  "addr" : "address8",
  "book" : "book8"
}]);

Postgres中对应SQL的查询如下:

SELECT * 
FROM 
    (SELECT 
         ROW_NUMBER() OVER (PARTITION BY idnew ORDER BY createdOn ASC) AS rownumber,
         * 
     FROM temp) AS TEMP 
WHERE 
    rownumber = 1 
    AND idnew IN ('12345', '12346', '12347') 
ORDER BY 
    createdOn ASC

我是 mongo db 的新手。我经历了聚合框架并且能够使用 $match 但无法使用 $group 从 idnew 组中获取具有最少 createdOn 的文档。我需要满足条件的文档的所有字段。 请帮助构建 mongo shell 的查询。

结果集应该如下

{
  "id"   : "12347",
  createdOn : ISODate("2016-09-10T19:26:01.000Z"),
  "addr" : "address7",
  "book" : "book7"
}, {
  "id"   : "12345",
  createdOn : ISODate("2016-09-14T19:25:00.000Z"),
  "addr" : "address8",
  "book" : "book8"
},  {
  "id"   : "12346",
  createdOn : ISODate("2016-09-14T19:26:01.000Z"),
  "addr" : "address5",
  "book" : "book5"
}

通过大量搜索和试验,我可以设法提取数据 但是使用 $arrayElemAt 函数时格式会发生变化。分享 下方查询。 请帮助我将此输出转换为上面共享的输出。

db.tempTest.aggregate(
   [

     {$sort : {createdOn:1}},
     { $group : { _id : "$id", details: { $push: "$$ROOT" } } },
     {$project:
      {

          details: { $arrayElemAt: [ "$details", 0 ] }

      }
  }

   ]
)

截至目前,输出显示为:

/* 1 */
{
    "_id" : "12347",
    "details" : {
        "_id" : ObjectId("57dc1b094c105db1a666b0a8"),
        "id" : "12347",
        "createdOn" : ISODate("2016-09-10T19:26:01.000Z"),
        "addr" : "address7",
        "book" : "book7"
    }
}

/* 2 */
{
    "_id" : "12345",
    "details" : {
        "_id" : ObjectId("57dc1b094c105db1a666b0a3"),
        "id" : "12345",
        "createdOn" : ISODate("2016-09-14T19:25:00.000Z"),
        "addr" : "address2",
        "book" : "book2"
    }
}

/* 3 */
{
    "_id" : "12346",
    "details" : {
        "_id" : ObjectId("57dc1b094c105db1a666b0a6"),
        "id" : "12346",
        "createdOn" : ISODate("2016-09-14T19:26:01.000Z"),
        "addr" : "address5",
        "book" : "book5"
    }
}

【问题讨论】:

    标签: mongodb-query aggregation-framework


    【解决方案1】:

    db.tempTest.aggregate(
       [
         
         {$sort : {createdOn:1}},
         { $group : { _id : "$id", id : { $first: '$id' }, createdOn : { $first: '$createdOn' }, 
           addr : { $first: '$addr' },book : { $first: '$book' } } 
         },
         {$sort : {createdOn:1}}
       ]
    )

    【讨论】: