2016-09-16 5 views
0

以下のデータがmongoコレクションにあります。 PostgresのでSQLに対応し集約フレームワークを使用して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" 
}]); 

クエリは以下のようになります:

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 

私はデシベルをモンゴに新しいです。私は集計フレームワークに行き、$ matchを使用することができましたが、$ groupを使用してidnewグループから少なくともcreatedOnでドキュメントをフェッチすることはできません。条件を満たす文書のすべてのフィールドが必要です。 mongo shellの質問に枠を付けるのを助けてください。

ResultSetが以下のようにする必要があります:

検索や裁判の多くの
{ 
    "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機能を使用したときのフォーマットが変更されます。下記の クエリを共有します。 この出力を上記の共有に変換するのを手伝ってください。

/* 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}} 
 
    ] 
 
)

:として出力示すように、今のように

db.tempTest.aggregate(
    [ 

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

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

     } 
    } 

    ] 
) 

関連する問題