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中,伙计们,我还没有完全解决我的问题,但有足够的信息进行进一步调查。将附上最终结果,如果我有:)