MongoDB Groupby与数组对象字段

发布于 2025-02-09 11:50:25 字数 3609 浏览 3 评论 0原文

我已经搜索了很多基于数组字段值的GroupBy,但是我在Google中没有得到正确的结果,因此我在此处发布。

我已经尽力了,它有效的50%需要纠正我的查询,任何人都可以帮助我解决这个

数据库值,就像

{"_id": "62b0bec8922dc767f8b933b4",
        "seatSeletion": [{
            "rowNo":  0,
            "columnNo": 0,
            "seatNo":  3
        }, {
            "rowNo": 0,
            "columnNo": 1,
            "seatNo": 4
        }],
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T18:14:38.133+00:00",
        "movieTiming": "1:30 p.m",
    },
    {"_id": "62b0b91560f57e0cb220db02","seatSeletion": [{
            "rowNo":  0,
            "columnNo": 0,
            "seatNo":  1
        }, {
            "rowNo": 0,
            "columnNo": 1,
            "seatNo": 2
        }],
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T18:14:38.133+00:00",
        "movieTiming": "1:30 p.m",
    }

预期的输出

{
            "seatSeletion": [
                {
                    "rowNo": 0,
                    "columnNo": 0,
                    "seatNo": 1
                },
                {
                    "rowNo": 0,
                    "columnNo": 1,
                    "seatNo": 2
                },
 {
                    "_id": "62b0b90e60f57e0cb220db00",
                    "rowNo": 0,
                    "columnNo": 0,
                    "seatNo": 3
                },
                {
                    "_id": "62b0b90e60f57e0cb220db01",
                    "rowNo": 0,
                    "columnNo": 1,
                    "seatNo": 4
                }
            ],
            "movieTiming": "1:30 p.m",
            "movieId": "62af1ff6cb38656a4ffe36aa",
            "movieDate": "2022-06-20T11:03:37.000Z"
        },

一样,这就是我在查询中的

Bookings.aggregate([
    {
      $match: {
        $and: [{ movieId: ObjectId(bookingParam.movieId) },
        { movieTiming: bookingParam.movieTiming },
        { movieDate: dateQuery },
        ]
      }
    },
    {
      $group: {
        _id: {
          seatSeletion: '$seatSeletion', movieTiming: '$movieTiming',
          movieId: '$movieId', movieDate: '$movieDate', createdBy: "$createdBy", updatedBy: "$updatedBy", movies: "$movies"
        }
      }
    },
    {
      $project: {
        seatSeletion: '$_id.seatSeletion', movieTiming: '$_id.movieTiming',
        movieId: '$_id.movieId', movieDate: '$_id.movieDate', movies: "$_id.movies",
        _id: 0
      }
    }
  ])

尝试

{
        "seatSeletion": [
            {
                "_id": "62b0b91560f57e0cb220db03",
                "rowNo": 0,
                "columnNo": 0,
                "seatNo": 1
            },
            {
                "_id": "62b0b91560f57e0cb220db04",
                "rowNo": 0,
                "columnNo": 1,
                "seatNo": 2
            }
        ],
        "movieTiming": "1:30 p.m",
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T11:03:37.000Z"
    },
    {
        "seatSeletion": [
            {
                "_id": "62b0b90e60f57e0cb220db00",
                "rowNo": 0,
                "columnNo": 0,
                "seatNo": 3
            },
            {
                "_id": "62b0b90e60f57e0cb220db01",
                "rowNo": 0,
                "columnNo": 1,
                "seatNo": 4
            }
        ],
        "movieTiming": "1:30 p.m",
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T11:03:37.000Z"
    }

can anyone help me to fix this issue.

I have searched a lot to use groupby based on the array field value, but I didn't get proper results in google, so I'm posting here.

I have tried my best, it works 50% need to correct my query can anyone help me with this

I have a database value like

{"_id": "62b0bec8922dc767f8b933b4",
        "seatSeletion": [{
            "rowNo":  0,
            "columnNo": 0,
            "seatNo":  3
        }, {
            "rowNo": 0,
            "columnNo": 1,
            "seatNo": 4
        }],
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T18:14:38.133+00:00",
        "movieTiming": "1:30 p.m",
    },
    {"_id": "62b0b91560f57e0cb220db02","seatSeletion": [{
            "rowNo":  0,
            "columnNo": 0,
            "seatNo":  1
        }, {
            "rowNo": 0,
            "columnNo": 1,
            "seatNo": 2
        }],
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T18:14:38.133+00:00",
        "movieTiming": "1:30 p.m",
    }

expected output

{
            "seatSeletion": [
                {
                    "rowNo": 0,
                    "columnNo": 0,
                    "seatNo": 1
                },
                {
                    "rowNo": 0,
                    "columnNo": 1,
                    "seatNo": 2
                },
 {
                    "_id": "62b0b90e60f57e0cb220db00",
                    "rowNo": 0,
                    "columnNo": 0,
                    "seatNo": 3
                },
                {
                    "_id": "62b0b90e60f57e0cb220db01",
                    "rowNo": 0,
                    "columnNo": 1,
                    "seatNo": 4
                }
            ],
            "movieTiming": "1:30 p.m",
            "movieId": "62af1ff6cb38656a4ffe36aa",
            "movieDate": "2022-06-20T11:03:37.000Z"
        },

this is how I tried in my query

Bookings.aggregate([
    {
      $match: {
        $and: [{ movieId: ObjectId(bookingParam.movieId) },
        { movieTiming: bookingParam.movieTiming },
        { movieDate: dateQuery },
        ]
      }
    },
    {
      $group: {
        _id: {
          seatSeletion: '$seatSeletion', movieTiming: '$movieTiming',
          movieId: '$movieId', movieDate: '$movieDate', createdBy: "$createdBy", updatedBy: "$updatedBy", movies: "$movies"
        }
      }
    },
    {
      $project: {
        seatSeletion: '$_id.seatSeletion', movieTiming: '$_id.movieTiming',
        movieId: '$_id.movieId', movieDate: '$_id.movieDate', movies: "$_id.movies",
        _id: 0
      }
    }
  ])

but i got it like this

{
        "seatSeletion": [
            {
                "_id": "62b0b91560f57e0cb220db03",
                "rowNo": 0,
                "columnNo": 0,
                "seatNo": 1
            },
            {
                "_id": "62b0b91560f57e0cb220db04",
                "rowNo": 0,
                "columnNo": 1,
                "seatNo": 2
            }
        ],
        "movieTiming": "1:30 p.m",
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T11:03:37.000Z"
    },
    {
        "seatSeletion": [
            {
                "_id": "62b0b90e60f57e0cb220db00",
                "rowNo": 0,
                "columnNo": 0,
                "seatNo": 3
            },
            {
                "_id": "62b0b90e60f57e0cb220db01",
                "rowNo": 0,
                "columnNo": 1,
                "seatNo": 4
            }
        ],
        "movieTiming": "1:30 p.m",
        "movieId": "62af1ff6cb38656a4ffe36aa",
        "movieDate": "2022-06-20T11:03:37.000Z"
    }

can anyone help me to fix this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

垂暮老矣 2025-02-16 11:50:25

一个选项是在$ group之后使用$降低。重要的是不要按seatseletion进行分组,因为这些字段的值对这些电影不是共同的:

db.collection.aggregate([
  {
    $match: {
      $and: [
        {movieId: "62af1ff6cb38656a4ffe36aa"},
        {movieTiming: "1:30 p.m"},
        {movieDate: "2022-06-20T18:14:38.133+00:00"},
        
      ]
    }
  },
  {
    $group: {
      _id: {movieTiming: "$movieTiming", movieId: "$movieId", movieDate: "$movieDate"},
      seatSeletion: {$push: "$seatSeletion"}
    }
  },
  {
    $project: {
      seatSeletion: {
        $reduce: {
          input: "$seatSeletion",
          initialValue: [],
          in: {$concatArrays: ["$value", "$this"]}
        }
      },
      movieTiming: "$_id.movieTiming",
      movieId: "$_id.movieId",
      movieDate: "$_id.movieDate",
      _id: 0
    }
  }
])

查看其在游乐场示例

另一个选项是使用$ utind而不是$ ydive

db.collection.aggregate([
  {
    $match: {
      $and: [
        {movieId: "62af1ff6cb38656a4ffe36aa"},
        {movieTiming: "1:30 p.m"},
        {movieDate: "2022-06-20T18:14:38.133+00:00"},
        
      ]
    }
  },
  {$unwind: "$seatSeletion"},
  {
    $group: {
      _id: {movieTiming: "$movieTiming", movieId: "$movieId", movieDate: "$movieDate"},
      seatSeletion: {$push: "$seatSeletion"}
    }
  },
  {
    $project: {
      seatSeletion: 1,
      movieTiming: "$_id.movieTiming",
      movieId: "$_id.movieId",
      movieDate: "$_id.movieDate",
      _id: 0
    }
  }
])

One option is using $reduce after the $group. It is important NOT to group by the seatSeletion as the value of this field is not common to these movies:

db.collection.aggregate([
  {
    $match: {
      $and: [
        {movieId: "62af1ff6cb38656a4ffe36aa"},
        {movieTiming: "1:30 p.m"},
        {movieDate: "2022-06-20T18:14:38.133+00:00"},
        
      ]
    }
  },
  {
    $group: {
      _id: {movieTiming: "$movieTiming", movieId: "$movieId", movieDate: "$movieDate"},
      seatSeletion: {$push: "$seatSeletion"}
    }
  },
  {
    $project: {
      seatSeletion: {
        $reduce: {
          input: "$seatSeletion",
          initialValue: [],
          in: {$concatArrays: ["$value", "$this"]}
        }
      },
      movieTiming: "$_id.movieTiming",
      movieId: "$_id.movieId",
      movieDate: "$_id.movieDate",
      _id: 0
    }
  }
])

See how it works on the playground example

Another option is using $unwind instead of $reduce, but it is generally considered slower:

db.collection.aggregate([
  {
    $match: {
      $and: [
        {movieId: "62af1ff6cb38656a4ffe36aa"},
        {movieTiming: "1:30 p.m"},
        {movieDate: "2022-06-20T18:14:38.133+00:00"},
        
      ]
    }
  },
  {$unwind: "$seatSeletion"},
  {
    $group: {
      _id: {movieTiming: "$movieTiming", movieId: "$movieId", movieDate: "$movieDate"},
      seatSeletion: {$push: "$seatSeletion"}
    }
  },
  {
    $project: {
      seatSeletion: 1,
      movieTiming: "$_id.movieTiming",
      movieId: "$_id.movieId",
      movieDate: "$_id.movieDate",
      _id: 0
    }
  }
])

See how it works on the playground example - unwind

趁年轻赶紧闹 2025-02-16 11:50:25

您几乎可以查询更多

{
  "_id": {
    "movieId": "62af1ff6cb38656a4ffe36aa",
    "movieDate": "2022-06-20T18:14:38.133+00:00",
    "movieTiming": "1:30 p.m"
  },
  "seatSeletion": [
    { "rowNo": 0,"columnNo": 0,"seatNo": 3
    },
    { "rowNo": 0,"columnNo": 1,"seatNo": 4
    },
    { "rowNo": 0,"columnNo": 0,"seatNo": 1
    },
    { "rowNo": 0,"columnNo": 1,"seatNo": 2
    }
  ]
}

输出

db.collection.aggregate(
    {
        $match: {}
    },
    {
        $unwind: {
            path: '$seatSeletion'
        }
    },
    {
        $group: {
            _id:
            {
                movieId: '$movieId',
                movieDate: '$movieDate',
                movieTiming: '$movieTiming'
            },
            seatSeletion:
                { $push: '$seatSeletion' }
        }
    }
)

more output nearly you expect

{
  "_id": {
    "movieId": "62af1ff6cb38656a4ffe36aa",
    "movieDate": "2022-06-20T18:14:38.133+00:00",
    "movieTiming": "1:30 p.m"
  },
  "seatSeletion": [
    { "rowNo": 0,"columnNo": 0,"seatNo": 3
    },
    { "rowNo": 0,"columnNo": 1,"seatNo": 4
    },
    { "rowNo": 0,"columnNo": 0,"seatNo": 1
    },
    { "rowNo": 0,"columnNo": 1,"seatNo": 2
    }
  ]
}

query

db.collection.aggregate(
    {
        $match: {}
    },
    {
        $unwind: {
            path: '$seatSeletion'
        }
    },
    {
        $group: {
            _id:
            {
                movieId: '$movieId',
                movieDate: '$movieDate',
                movieTiming: '$movieTiming'
            },
            seatSeletion:
                { $push: '$seatSeletion' }
        }
    }
)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文