在MongoDB中编写一个查询,以查找条目进入集合的次数

b1uwtaje  于 2022-11-22  发布在  Go
关注(0)|答案(2)|浏览(179)

我有这样的蒙戈系列

[
    /* 1 */
    {
        "_id" : 1,
        "data_id" : 1,
        "data_test" : "sample1",
        "data_list" : [ 
            "sun"
        ],
    }

    /* 2 */
    {
        "_id" : 2,
        "data_id" : 1,
        "data_test" : "sample2",
        "data_list" : [ 
            "sun",
            "mon"
        ],
    }

    /* 3 */
    {
        "_id" : 3,
        "data_id" : 2,
        "data_test" : "sample3",
        "data_list" : [ 
            "tue"
        ],
    }
    /* 4 */
    {
        "_id" : 4,
        "data_id" : 2,
        "data_test" : "sample4",
        "data_list" : [ 
            "tue",
            "wed"
        ],
    }

]

我想查询这个来得到data_list的元素在一个data_id相同的集合中出现的次数。如果data_list是一个元素而不是一个列表,可以使用这样的SQL查询来实现。

Select data_list, count(*) from analytics_customer where data_id = 1 group by data_list

如果我们只查询“data_id”,输出应该如下所示:1

{
    "sun": 2,
    "mon": 1
}

“data_id”的输出为:2

{
    "tue": 2,
    "wed": 1
}
up9lanfz

up9lanfz1#

蒙戈Playground工作示例:https://mongoplayground.net/p/tJjmjcPQWer
工艺流程:

  • $match以选择所需的data_id
  • $unwind以获取所有日期作为单独的记录,以便可以对它们进行分组
  • $group唯一的days和data_id组合在一起。这还使我们能够获得$的days计数
  • $group再次仅通过data_id(或null)获取每个数据id的单个记录,但也$push日期,以便将它们放入数组中
  • $project使用$arrayToObject将文档的最终格式转换为对象。

值得注意的是,您可以更改对象的根,但将其保留在days字段中进行操作会更简单。
汇总永远会产生数组,而不是单一对象。
我相信有更好的方法。
查询

db.collection.aggregate([
  { $match: { "data_id": 1 } }, // If you want to aggregate for a single data_id
  {
    $unwind: "$data_list"
  },
  {
    $group: {
      _id: {
        data_id: "$data_id", // If you want to aggregate for all data_ids
        data_list: "$data_list",
        
      },
      count: {
        $count: {}
      }
    }
  },
  {
    $group: {
      _id: "$_id.data_id", // If you want to aggregate for all data_ids
      //_id: null,
      days: {
        $push: {
          k: "$_id.data_list",
          v: "$count"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      data_id: "$_id", // If you want to aggregate for all data_ids
      days: {
        $arrayToObject: "$days"
      }
    }
  }
])

结果(对于单个ID):

[
  {
    "data_id": 1,
    "days": {
      "mon": 1,
      "sun": 2
    }
  }
]

结果(对于所有ID):

[
  {
    "data_id": 2,
    "days": {
      "tue": 2,
      "wed": 1
    }
  },
  {
    "data_id": 1,
    "days": {
      "mon": 1,
      "sun": 2
    }
  }
]
f0brbegy

f0brbegy2#

您可以使用aggregation
或者如果列表中的选项数量是固定的(一周7天),则可以运行.count() 7次,并使用$exists搜索每一天

相关问题