2014-10-09 86 views
0

我有這樣的文件結構蒙戈DB查詢 - 利用最新一個分組結果

{ 
    lang: en, 
    origin: 'Origin Value', 
    key: 'Key', 
    translation: 'Translated value', 
    createdAt: <date> 
} 

因此,有各種不同的語言(恩,德,它等),也有很多關鍵的重複使用不同的日期(createdAt字段)。我需要構建一個查詢,它將爲每種語言的每個關鍵點採用最新的本地化,並按lang進行分組。

預期結果:

{ 
    en: [ 
    { 
     origin: 'Origin Value', 
     key: 'Key', 
     translation: 'Translated value', 
     createdAt: <the latest one date for this particular key>  
    }, 
    { 
     origin: 'Second Origin Value', 
     key: 'Second Key', 
     translation: 'Second Translated value', 
     createdAt: <the latest one date for this particular key>  
    } 
    ... 
    ], 
    de: [...], 
    it: [...], 
    ... 
} 

回答

1

在蒙戈外殼V2.6.4運行

var cursor = db.c.aggregate([ { 
    $sort : { 
     // sort to make sure the latest document of every group (lang, key) is at 
     // first location. 
     createAt : -1 
    } 
}, { 
    $group : { 
     _id : { 
      lang : "$lang", 
      key : "$key" 
     }, 
     doc : { 
      $first : "$$ROOT" // current entire document 
     } 
    } 
}, { 
    $group : { 
     _id : "$_id.lang", // regroup to combine all keys into one lang 
     body : { 
      $push : { 
       orgin : "$doc.origin", 
       key : "$doc.key", 
       translation : "$doc.translation", 
       createAt : "$doc.createAt" 
      } 
     } 
    } 
} ]); 

var result = {}; // store final result 
cursor.forEach(function(doc) { 
    result[doc._id] = doc.body; // aggregation pipeline can not process on key, 
           // this is a way to convert data to your 
           // expected format 
}); 

如果運行V2.6之前蒙戈外殼,在最後聲明認爲這種方式:

cursor.result.forEach(function(doc) { 
    result[doc._id] = doc.body; 
}); 
1

這應該爲你做的工作,不知怎麼的,所以首先在創建的結果進行排序和檢索的第一個結果爲使用$第一運營商各組:

db.dictionary.aggregate(
{$sort: {createdAt:-1}}, 
{$group: {_id:{lang: "$lang", key:"$key"}, createdAt:{$first:"$createdAt"}, origin: {$first:"$origin"}, translation: {$first:"$translation"}}}) 

順便說一句,據我所知,你不能有聚合框架中的動態字段名稱,所以你不能有語言鍵作爲輸出中的字段名稱。

+0

我認爲這是不正確使用'{ $ group:{_id:「$ key」,lang:{$ first:「$ lang」},createdAt:{$ first:「$ createdAt」},origin:{$ first:「$ origin」},translation:{ $第一: 「$翻譯」}}}'。因爲在這個處理之後,每個**鍵**只會有一個** lang **,但實際上它可能會有幾個** lang **。 – Wizard 2014-10-10 01:46:27

+0

你是對的;組ID需要是關鍵和郎,如在第二個查詢 – cubbuk 2014-10-10 05:10:38

+0

謝謝你們,我還沒有完全解決我的問題,但有足夠的信息進一步調查。如果我有這樣的話,會附上最終結果:) – 2014-10-11 11:31:36