Mongodb Mongo DB查询-获取最新的查询并分组结果

Mongodb Mongo DB查询-获取最新的查询并分组结果,mongodb,mongodb-query,Mongodb,Mongodb Query,我有这样的文档结构 { lang: en, origin: 'Origin Value', key: 'Key', translation: 'Translated value', createdAt: <date> } { 朗:嗯, 原点:“原点值”, 键:“键”, 翻译:“翻译价值”, 创建数据: } 因此,有多种语言(en、de、it等),并且有许多键在不同日期重复(createdAt字段)。我需要构造一个查询,它将获取每种语言的每个键的最新本地化信息,

我有这样的文档结构

{
  lang: en,
  origin: 'Origin Value',
  key: 'Key',
  translation: 'Translated value',
  createdAt: <date>
}
{
朗:嗯,
原点:“原点值”,
键:“键”,
翻译:“翻译价值”,
创建数据:
}
因此,有多种语言(en、de、it等),并且有许多键在不同日期重复(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: [...],
  ...
}
{
嗯:[
{
原点:“原点值”,
键:“键”,
翻译:“翻译价值”,
创建数据:
},
{
原点:“第二原点值”,
键:“第二个键”,
翻译:“第二个翻译值”,
创建数据:
}
...
],
de:[…],
它:[…],
...
}

这应该可以为您做一些工作,因此首先按照在处创建的结果对结果进行排序,然后使用$first运算符检索每个组的第一个结果:

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

顺便说一句,据我所知,聚合框架中不能有动态字段名,因此输出中不能有语言键作为字段名。

在mongo shell 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之前运行Mango shell,那么在最后一个语句中考虑这样的方式:

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

我认为使用
{$group:{$id:{$key],lang:{$first:$lang},createdAt:{$first:$createdAt},origin:{$first:$origin},translation:{$first:$translation”}是不正确的。因为经过这个处理,每个键只有一个lang,但实际上可能有几个lang;组id必须是key和lang,例如在第二个QueryTanks中,伙计们,我还没有完全解决我的问题,但有足够的信息进行进一步调查。将附上最终结果,如果我有:)