如何使用 mongoose 和 GraphQL select 基于子值的父级?
How to select parent based on children's value using mongoose and GraphQL?
我正在尝试实现与条件 JOIN 查询等效的东西,但随后使用 GraphQL。
我将 Mongoose 用于我的数据库模型,并将 MongoDB 作为数据库。
我将使用以下 graphQL 模式说明我的问题:
type Booking {
_id: ID!
client: Client!
rooms: Room!
activities: Activity!
nrOfAdults: Int!
arrivalDate: String!
departureDate: String!
}
type Room {
_id: ID!
name: String!
contents: String
priceNight: Float!
maxAdults: Int!
reservations: [Booking]
}
猫鼬模式:
const bookingSchema = new Schema(
{
client: {
type: Schema.Types.ObjectId,
ref: 'Client'
},
rooms: [{
type: Schema.Types.ObjectId,
ref: 'Rooms'
}],
nrOfAdults: {
type: Number,
required: true
},
arrivalDate: {
type: Date,
required: true
},
departureDate: {
type: Date,
required: true
}
},
{ timestamps: true }
);
const roomSchema = new Schema({
name: {
type: String,
required: true
},
priceNight: {
type: Number,
required: true
},
maxAdults: {
type: Number,
required: true
},
reservations: [
{
type: Schema.Types.ObjectId,
ref: 'Booking'
}
]
});
我可以查询房间,例如,如果我想获得 3 个或更多成人的房间,我 运行:
Room.find({
maxAdults: { $gte: 3 }
});
这很好用。
不过,我还想显示可用的间房间,这意味着我需要对reservation中保留的预订对象施加条件。
我认为这会相当容易,使用类似的东西:
Room.find({
maxAdults: { $gte: 3 },
reservations: { $elemMatch: { arrivalDate: { $gte: *some date*}}}
});
但它 return 是一个空数组,而它应该 return 一些值,基于 mongodb:
中的数据
为了让事情更清楚一点,我想获得与以下 SQL 查询相同的结果:
SELECT *
FROM room
JOIN booking ON room.id = booking.roomId
WHERE
room.maxAdults >= 3
AND
(
booking.arrivalDate > CAST('2020-05-15' AS DATE)
OR
booking.departureDare < CAST(2020-05-06' AS DATE)
)
假设您已经保存了类似于您在 mongoose 模式中提到的值。
探索如何加入mongodb。目的是在对来自不同集合的子字段执行查询之前进行连接。
相关答案:How do I perform the SQL Join equivalent in MongoDB?
我建议使用聚合管道来完成你想要的。
建议代码:
Room.aggregate([
{
$match: {
maxAdults: { $gte: 3 }
}
},
{
$lookup: {
from: "bookings",
localField: "reservations",
foreignField: "_id",
as: "booking"
}
},
{
$unwind: '$booking'
},
{
$match: {
booking.arrivalDate: { $gte: *some date* }
}
},
])
我正在尝试实现与条件 JOIN 查询等效的东西,但随后使用 GraphQL。 我将 Mongoose 用于我的数据库模型,并将 MongoDB 作为数据库。
我将使用以下 graphQL 模式说明我的问题:
type Booking {
_id: ID!
client: Client!
rooms: Room!
activities: Activity!
nrOfAdults: Int!
arrivalDate: String!
departureDate: String!
}
type Room {
_id: ID!
name: String!
contents: String
priceNight: Float!
maxAdults: Int!
reservations: [Booking]
}
猫鼬模式:
const bookingSchema = new Schema(
{
client: {
type: Schema.Types.ObjectId,
ref: 'Client'
},
rooms: [{
type: Schema.Types.ObjectId,
ref: 'Rooms'
}],
nrOfAdults: {
type: Number,
required: true
},
arrivalDate: {
type: Date,
required: true
},
departureDate: {
type: Date,
required: true
}
},
{ timestamps: true }
);
const roomSchema = new Schema({
name: {
type: String,
required: true
},
priceNight: {
type: Number,
required: true
},
maxAdults: {
type: Number,
required: true
},
reservations: [
{
type: Schema.Types.ObjectId,
ref: 'Booking'
}
]
});
我可以查询房间,例如,如果我想获得 3 个或更多成人的房间,我 运行:
Room.find({
maxAdults: { $gte: 3 }
});
这很好用。
不过,我还想显示可用的间房间,这意味着我需要对reservation中保留的预订对象施加条件。 我认为这会相当容易,使用类似的东西:
Room.find({
maxAdults: { $gte: 3 },
reservations: { $elemMatch: { arrivalDate: { $gte: *some date*}}}
});
但它 return 是一个空数组,而它应该 return 一些值,基于 mongodb:
中的数据为了让事情更清楚一点,我想获得与以下 SQL 查询相同的结果:
SELECT *
FROM room
JOIN booking ON room.id = booking.roomId
WHERE
room.maxAdults >= 3
AND
(
booking.arrivalDate > CAST('2020-05-15' AS DATE)
OR
booking.departureDare < CAST(2020-05-06' AS DATE)
)
假设您已经保存了类似于您在 mongoose 模式中提到的值。
探索如何加入mongodb。目的是在对来自不同集合的子字段执行查询之前进行连接。
相关答案:How do I perform the SQL Join equivalent in MongoDB?
我建议使用聚合管道来完成你想要的。
建议代码:
Room.aggregate([
{
$match: {
maxAdults: { $gte: 3 }
}
},
{
$lookup: {
from: "bookings",
localField: "reservations",
foreignField: "_id",
as: "booking"
}
},
{
$unwind: '$booking'
},
{
$match: {
booking.arrivalDate: { $gte: *some date* }
}
},
])