Javascript 如何筛选文档中的嵌入文档?

Javascript 如何筛选文档中的嵌入文档?,javascript,mongodb,Javascript,Mongodb,我当时正在做一个包含大量数据库操作的综合作业,在筛选文档中的嵌入文档时遇到问题,我一直都很顺利 我的文件看起来像 { flightId: "IND-101", AircraftName: "Delta Airlines", fare: 600, availableSeats: 5, status: "Running", bookings: [ { customerId: "P1001",

我当时正在做一个包含大量数据库操作的综合作业,在筛选文档中的嵌入文档时遇到问题,我一直都很顺利

我的文件看起来像

{
    flightId: "IND-101",
    AircraftName: "Delta Airlines",
    fare: 600,
    availableSeats: 5,
    status: "Running",
    bookings: [
        {
            customerId: "P1001",
            bookingId: 2001,
            noOfTickets: 3,
            bookingCost: 1800
        },
        {
            customerId: "S1001",
            bookingId: 2003,
            noOfTickets: 2,
            bookingCost: 1200
        }
    ]
},
{
    flightId: "IND-102",
    AircraftName: "JetBlue",
    fare: 750,
    availableSeats: 20,
    status: "Cancelled",
    bookings: [
        {
            customerId: "P1001",
            bookingId: 2002,
            noOfTickets: 3,
            bookingCost: 2250
        },
        {
            customerId: "G1001",
            bookingId: 2004,
            noOfTickets: 2,
            bookingCost: 1500
        }
    ]
}
我已经尝试了下面的代码,但显然,它正在返回所有的预订文档

return flightModel.find({ $and: [{ flightId: flightId }, { "bookings.customerId": customerId }] }, { bookings:1, _id: 0 })
变量flightId和customerId是使用函数给出的。 如果我将flightId指定为IND-101,将customerID指定为P1001,那么所需的输出是

{
        customerId: "P1001",
        bookingId: 2001,
        noOfTickets: 3,
        bookingCost: 1800
    }

那我该怎么做呢?如何根据筛选条件选择特定的嵌入文档?

您可以对$filter运行聚合查询,并对所需字段进行$project。 这样的办法应该行得通

let pipeline = [
  {$match: {flightId: flightId}},
  {$filter: {
    input: '$bookings'
    as: 'booking',
    cond: {$eq: {'$$booking.customerId', customerId}}
  }},
  {$project: {
    bookings: "$bookings"
  }}
]

flightModel.aggregate(pipeline);

您可能需要将bookings提取到它自己的集合中,或者执行聚合查询并对所需的字段进行$project。我对聚合不太了解,但这对我很有帮助。谢谢