2016-09-16 3 views
0

Ich habe unter Daten in meiner Mongo-Sammlung.Umwandlung von SQL-Abfrage zu Mongo mit Aggregat-Framework

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" 
}]); 

Abfrage wie unten wäre SQL in Postgres entsprechen:

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 

Ich bin db mongo. Ich ging durch Aggregation Rahmen und war in der Lage, $ match zu verwenden, aber bin nicht in der Lage, das Dokument mit mindestens createdOn aus der Gruppe idnew mit $ Gruppe zu holen. Ich brauche alle Felder der Dokumente, die die Bedingungen erfüllen. Bitte helfen Sie, die Abfrage für Mongo-Shell einrahmen.

Resultset sollten wie unten sein:

{ 
    "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" 
} 

Mit vielen Recherchen und Studien, ich gelang Daten zu extrahieren aber Format geändert wird, wenn $ arrayElemAt Funktion verwendet wird. Teilen Abfrage unten. Bitte helfen Sie mir bei der Konvertierung dieser Ausgabe zu der oben genannten.

db.tempTest.aggregate(
    [ 

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

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

     } 
    } 

    ] 
) 

Ab sofort Ausgabe zeigt, wie:

/* 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" 
    } 
} 

Antwort

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