2016-09-16 88 views
0

我在我的mongo集合中有以下数据。使用聚合框架将SQL查询转换为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 

我是新来蒙戈分贝。我通过了聚合框架并能够使用$匹配,但无法使用$ 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" 
    } 
} 

回答

0

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