{
"source": "Chennai",
"destination": "Kolkata",
"flights": [
{
"flightId": "E6-2145",
"seatsAvailable": 10,
"fare": [
{
"travelClass": "Economy",
"baseFare": 3588
},
{
"travelClass": "Business",
"baseFare": 9999
}
]
}
]
}如果低于3800,我想把经济舱的底座更新到3800。
我试过:
db.Flights.aggregate({
$unwind: "$flights"
},
{
$match: {
"flights.fare": {
$elemMatch: {
travelClass: "Economy",
baseFare: {
$lt: 3800
}
}
}
}
},
{
$set: {
"flights.fare.basefare": 3800
}
})但是,它正在将飞行的两个基本要素,即经济和商业,都更新到3800。
请帮我解决这个问题。
发布于 2022-09-18 02:53:28
这是因为flight.fare是一个数组,通过使用flight.fare.baseFare设置值,它将更新flight.fare数组中每个文档的basefare值。
您需要$map操作符来迭代flight.fare数组中的每个文档,并在文档满足条件时更新basefare值。
解决方案1
db.collection.aggregate([
{
$unwind: "$flights"
},
{
$match: {
"flights.fare": {
$elemMatch: {
travelClass: "Economy",
baseFare: {
$lt: 3800
}
}
}
}
},
{
$set: {
"flights.fare": {
$map: {
input: "$flights.fare",
as: "fare",
in: {
$cond: {
if: {
$and: [
{
$eq: [
"$$fare.travelClass",
"Economy"
]
},
{
$lt: [
"$$fare.baseFare",
3800
]
}
]
},
then: {
$mergeObjects: [
"$$fare",
{
baseFare: 3800
}
]
},
else: "$$fare"
}
}
}
}
}
}
])$unwind解决方案2:不使用
db.collection.aggregate([
{
$set: {
flights: {
$map: {
input: "$flights",
as: "flight",
in: {
$mergeObjects: [
"$$flight",
{
fare: {
$map: {
input: "$$flight.fare",
in: {
$cond: {
if: {
$and: [
{
$eq: [
"$$this.travelClass",
"Economy"
]
},
{
$lt: [
"$$this.baseFare",
3800
]
}
]
},
then: {
$mergeObjects: [
"$$this",
{
baseFare: 3800
}
]
},
else: "$$this"
}
}
}
}
}
]
}
}
}
}
}
])注意:两个聚合查询都将导致更新projection__,的值,但不会更新集合__中的文档。
https://stackoverflow.com/questions/73759777
复制相似问题