[英]MongoDB - How to update a particular element in nested array
{
"source": "Chennai",
"destination": "Kolkata",
"flights": [
{
"flightId": "E6-2145",
"seatsAvailable": 10,
"fare": [
{
"travelClass": "Economy",
"baseFare": 3588
},
{
"travelClass": "Business",
"baseFare": 9999
}
]
}
]
}
如果低於 3800,我想將經濟 class 的基本票價更新為 3800。
我試過了:
db.Flights.aggregate({
$unwind: "$flights"
},
{
$match: {
"flights.fare": {
$elemMatch: {
travelClass: "Economy",
baseFare: {
$lt: 3800
}
}
}
}
},
{
$set: {
"flights.fare.basefare": 3800
}
})
但它正在將航班的基本票價(即經濟艙和商務艙)更新為 3800。
請幫我解決這個問題。
由於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"
}
}
}
}
}
}
])
解決方案 2:沒有$unwind
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更新值,但不會更新 collection 中的文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.