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_price900,我想将 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_price810.25,而不是我期望 $elemMatch 给我的(数组中的第 3 个元素,其 purchased_price900)。

有没有一种方法可以修改这个嵌套的嵌套数组,而不是把整个东西拉下来,修改我程序中的数据,然后把整个东西写回去?

请帮忙,谢谢。

据我所知,位置运算符只支持一层深度,并且只支持第一个匹配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 这有帮助。