Mongo 数据库修改嵌套数组中的元素
Mongo DB modify elements in nested arrays
我想知道如何在 Mongo 数据库中更改此类数组中的元素。假设集合如下:
{
"_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
in "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"
}
]
},
我尝试在 mongo shell
中使用 $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}})
似乎查询总是return "portfolio:market_symbol":"NASDAQ:GOOGL"
的整个部分,因为{$set:{"portfolio.$.details.0.amount":300}}
中的0
修改了details
中的第一个数组, purchased_price
是 810.25
,而不是我期望 $elemMatch
给我的(数组中的第 3 个元素,其 purchased_price
是 900
)。
有没有一种方法可以修改这个嵌套的嵌套数组,而不是把整个东西拉下来,修改我程序中的数据,然后把整个东西写回去?
请帮忙,谢谢。
据我所知,位置运算符只支持一层深度,并且只支持第一个匹配element.So,这意味着现在无法更新数组中的所有文档。
有一个 MongoDB JIRA 票证:https://jira.mongodb.org/browse/SERVER-831
但您可以手动更新特定文档。
db.test.find(
{ "user_info.user_name":"joe", "portfolio.details.purchased_price" : 900.0 }).forEach(function(doc) {
doc.portfolio.forEach(function(item) {
item.details.forEach(function (amt){
if (amt.purchased_price == 900.0)
amt.amount=300
});
});
db.test.update( { "user_info.user_name":"joe", "portfolio.details.purchased_price" : 900.0 }, { "$set": { "portfolio": doc.portfolio } });
});
它适用于 me.Hope 这有帮助。
我想知道如何在 Mongo 数据库中更改此类数组中的元素。假设集合如下:
{
"_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
in "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"
}
]
},
我尝试在 mongo shell
中使用$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}})
似乎查询总是return "portfolio:market_symbol":"NASDAQ:GOOGL"
的整个部分,因为{$set:{"portfolio.$.details.0.amount":300}}
中的0
修改了details
中的第一个数组, purchased_price
是 810.25
,而不是我期望 $elemMatch
给我的(数组中的第 3 个元素,其 purchased_price
是 900
)。
有没有一种方法可以修改这个嵌套的嵌套数组,而不是把整个东西拉下来,修改我程序中的数据,然后把整个东西写回去?
请帮忙,谢谢。
据我所知,位置运算符只支持一层深度,并且只支持第一个匹配element.So,这意味着现在无法更新数组中的所有文档。
有一个 MongoDB JIRA 票证:https://jira.mongodb.org/browse/SERVER-831
但您可以手动更新特定文档。
db.test.find(
{ "user_info.user_name":"joe", "portfolio.details.purchased_price" : 900.0 }).forEach(function(doc) {
doc.portfolio.forEach(function(item) {
item.details.forEach(function (amt){
if (amt.purchased_price == 900.0)
amt.amount=300
});
});
db.test.update( { "user_info.user_name":"joe", "portfolio.details.purchased_price" : 900.0 }, { "$set": { "portfolio": doc.portfolio } });
});
它适用于 me.Hope 这有帮助。