Mongodb Aggregate返回数据相关的动态条件

watbbzwu  于 2023-05-22  发布在  Go
关注(0)|答案(1)|浏览(114)

我的数据有两个重要的字段“成功”和“错误”。我想检索所有具有。但是,如果用户两者都有,则应该忽略“error”,而只看到“success”对象。我有点难以用语言表达。请不要犹豫,要求澄清问题。
聚合从这个匹配项开始

{
        "$and" : [
            {
                "time" : {
                    "$gte" : ISODate("2023-04-23T00:00:00.000+0000")
                }
            },
            {
                "time" : {
                    "$lte" : ISODate("2023-04-25T00:00:00.000+0000")
                }
            },
            {
                "$or" : [
                    {
                        "type" : "success"
                    },
                    {
                        "type" : "error"
                    }
                ]
            }
        ]
    }

接下来是小组赛阶段

{
    "_id": {
         "name": "$data.agent.name",
         "id": "$data.agent.id",
         "time": {"$dateToString": {"format": "%m-%d-%Y", "date": "$time"}},
         "type": "$type",
    }
}

以下是结果摘录

{
    "_id" : {
        "name" : "Samus Aran",
        "id" : "ID123456",
        "time" : "04-24-2023",
        "type" : "success"
    }
}
{
    "_id" : {
        "name" : "Samus Aran",
        "id" : "ID123456",
        "time" : "04-24-2023",
        "type" : "error"
    }
}
{
    "_id" : {
        "name" : "John Doe",
        "id" : "ID654321",
        "time" : "04-24-2023",
        "type" : "error"
    }
}
{
    "_id" : {
        "name" : "Jean Moulin",
        "id" : "ID456123",
        "time" : "04-24-2023",
        "type" : "success"
    }
}

我想如果一个ID号同时有成功类型和错误类型,在同一天,错误应该被忽略。使用上面的一组结果作为示例,我们应该得到以下结果:

{
    "_id" : {
        "name" : "Samus Aran",
        "id" : "ID123456",
        "time" : "04-24-2023",
        "type" : "success"
    }
}
{
    "_id" : {
        "name" : "John Doe",
        "id" : "ID654321",
        "time" : "04-24-2023",
        "type" : "error"
    }
}
{
    "_id" : {
        "name" : "Jean Moulin",
        "id" : "ID456123",
        "time" : "04-24-2023",
        "type" : "success"
    }
}

为了清楚起见,如果结果集的成员同时具有这两种类型,则只应返回success类型。注意:一个ID每天可能有多个成功和错误类型。我只需要知道一个ID是否有一个错误类型,当天没有成功类型或(至少1)只有成功类型。请注意,这肯定会在任何情况下驱动查询,但这个查询随后将被添加到go应用程序中。

qgelzfjb

qgelzfjb1#

一个选项是将$group替换为:
1.排序使successerror之前
1.将类型组合到一个集合中
1.只保留第一种类型

db.collection.aggregate([
  {$sort: {type: -1}},
  {$group: {
      "_id": {
        "name": "$data.agent.name",
        "id": "$data.agent.id",
        "time": {"$dateToString": {"format": "%m-%d-%Y", "date": "$time"}}
      },
      type: {$addToSet: "$type"}
  }},
  {$set: {type: {$first: "$type"}}}
])

了解它在playground example上的工作原理

相关问题