Мне интересно, как я могу изменить элемент в таком массиве в Mongo DB. Скажем коллекции выглядит следующим образом:Mongo DB изменить элементы в вложенных массивах
{
"_id" : ObjectId("xxxxxxxxxxxxxxxx"),
"user_info" : {
"user_name" : "joe",
},
"portfolio" : [
{
"market_symbol" : "NASDAQ:GOOGL",
"details" : [
{
"amount" : 100,
"purchased_price" : 810.25,
"date_of_purchase" : "20170210 212426"
},
{
"amount" : 100,
"purchased_price" : 810.25,
"date_of_purchase" : "20170210 212426"
},
{
"amount" : 200,
"purchased_price" : 900.0,
"date_of_purchase" : "20170210 212426"
}
]
},
{
"market_symbol" : "NYSE:BABA",
"details" : [
{
"amount" : 200,
"purchased_price" : 80.0,
"date_of_purchase" : "20170210 212426"
},
{
"amount" : 333,
"purchased_price" : 86.11,
"date_of_purchase" : "20170210 212426"
}
]
}
]
Я пытаюсь изменить значение amount
в "portfolio:market_symbol":"NASDAQ:GOOGL"
, где purchased_price
является 900
, и я хочу, чтобы установить 200 до 300.
так в сегмент должен выглядеть после модификации:
"portfolio" : [
{
"market_symbol" : "NASDAQ:GOOGL",
"details" : [
{
"amount" : 100,
"purchased_price" : 810.25,
"date_of_purchase" : "20170210 212426"
},
{
"amount" : 100,
"purchased_price" : 810.25,
"date_of_purchase" : "20170210 212426"
},
{
"amount" : 300,
"purchased_price" : 900.0,
"date_of_purchase" : "20170210 212426"
}
]
},
Я пытался использовать $elemMatch
в Монго оболочки
db.Users.update({"user_info.user_name":"joe","portfolio":{$elemMatch:{"market_symbol":{$eq:"NASDAQ:GOOGL"},"details.purchased_price":{$eq:900}}}},{$set:{"portfolio.$.details.0.amount":300}})
Кажется, что запрос всегда возвращает весь раздел "portfolio:market_symbol":"NASDAQ:GOOGL"
, потому что 0
в {$set:{"portfolio.$.details.0.amount":300}}
изменяет первый массив в details
, чьи purchased_price
является 810.25
, а не то, что я ожидаю, что $elemMatch
дать мне (3-й элемент из массива, purchased_price
- 900
).
Есть ли способ, которым я могу изменить этот вложенный вложенный массив, вместо того, чтобы вытащить все это, изменить данные в моей программе, а затем записать всю вещь обратно?
Пожалуйста, помогите, спасибо.