Mongodb 具有记录优先级的Mongo组聚合

Mongodb 具有记录优先级的Mongo组聚合,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在尝试执行MongoDB 3.6聚合,但我无法找到正确的方法 问题如下。在执行了几个聚合步骤后,我得到的结果集如下: [ { _id: { month: 1, type: 'estimate' }, value: 50 }, { _id: { month: 2, type: 'estimate' }, value: 40 }, { _id: { month: 3, type: 'estimate' }, value: 35 }, { _id: { month: 3, type

我正在尝试执行MongoDB 3.6聚合,但我无法找到正确的方法

问题如下。在执行了几个聚合步骤后,我得到的结果集如下:

[
  { _id: { month: 1, type: 'estimate' }, value: 50 },
  { _id: { month: 2, type: 'estimate' }, value: 40 },
  { _id: { month: 3, type: 'estimate' }, value: 35 },
  { _id: { month: 3, type: 'exact' }, value: 33.532 },
  { _id: { month: 4, type: 'estimate' }, value: 10 },
  { _id: { month: 4, type: 'exact' }, value: 11.244 },
]
它包含按月份分组的值。每个月的价值可以是“估计”或“精确”。现在,我想减少这一结果,以实现这一点:

[
  { _id: { month: 1 }, value: 50 },
  { _id: { month: 2 }, value: 40 },
  { _id: { month: 3 }, value: 33.532 },
  { _id: { month: 4 }, value: 11.244 },
]
基本上,我希望尽可能使用'exact'类型的值,并且只在不知道'exact'的月份回退到'estimate'值

任何帮助或提示都将不胜感激。我希望在数据库中而不是在服务器上执行聚合。

您可以简单地通过
键入
,然后在下一阶段使用,这将为您提供
精确的
(如果存在)和
估计
。尝试:

db.col.aggregate([
    {
        $sort: { "_id.type": -1 }
    },
    {
        $group:{
            _id: "$_id.month",
            value: { $first: "$value" }
        }
    },
    {
        $sort: { _id: 1 }
    }
])
印刷品:

{ "_id" : 1, "value" : 50 }
{ "_id" : 2, "value" : 40 }
{ "_id" : 3, "value" : 33.532 }
{ "_id" : 4, "value" : 11.244 }
因此,按
类型排序
在这里被视为优先排序,因为我们知道,在
估计之前,在词汇上
精确的
。您还可以更明确地添加名为
权重
(使用)运算符计算的额外字段,然后按该权重排序:

db.col.aggregate([
    {
        $addFields: { 
            weight: { $cond: [ { $eq: [ "$_id.type", "exact" ] }, 2, 1 ] } 
        }
    },
    {
        $sort: { "weight": -1 }
    },
    {
        $group:{
            _id: "$_id.month",
            value: { $first: "$value" }
        }
    },
    {
        $sort: { _id: 1 }
    }
])