【问题标题】:Update array content within another array that don't have key更新另一个没有键的数组中的数组内容
【发布时间】:2017-02-13 11:02:16
【问题描述】:

我的 mongoDB 内容如下:

[
   {
      "_id":{
         "$oid":"57c6699711bd6a0976cabe8a"
      },
      "ID":"1111",
      "FullName":"AAA",
      "Category":[
         {
            "CategoryId":{
               "$oid":"57c66ebedcba0f63c1ceea51"
            },
            "_id":{
               "$oid":"57e38a8ad190ea1100649798"
            },
            "Value":[
               {
                  "Name":""
               }
            ]
         },
         {
            "CategoryId":{
               "$oid":"57c3df061eb1e59d3959cc40"
            },
            "_id":{
               "$oid":"57e38a8ad190ea1100649797"
            },
            "Value":[
               [
                  "111",
                  "XXXX",
                  "2005"
               ],
               [
                  "1212",
                  "YYYY",
                  "2000"
               ],
               [
                  "232323",
                  "ZZZZZ",
                  "1999"
               ]
            ]
         }
      ]
   },
   {
      "_id":{
         "$oid":"57c6699711bd6a0976cabe8a"
      },
      "ID":"1111",
      "FullName":"BBB",
      "Category":[
         {
            "CategoryId":{
               "$oid":"57c66ebedcba0f63c1ceea51"
            },
            "_id":{
               "$oid":"57e38a8ad190ea1100649798"
            },
            "Value":[
               {
                  "Name":""
               }
            ]
         },
         {
            "CategoryId":{
               "$oid":"57c3df061eb1e59d3959cc40"
            },
            "_id":{
               "$oid":"57e38a8ad190ea1100649797"
            },
            "Value":[
               [
                  "4444",
                  "XXXX",
                  "2005"
               ],
               [
                  "7777",
                  "GGGG",
                  "2000"
               ],
               [
                  "8888",
                  "ZZZZZ",
                  "1999"
               ]
            ]
         }
      ]
   }
]

这里我有一个名为“类别”的数组,其中包含具有不同类别 ID 的对象。

我需要

  1. 选择一个特定的类别 ID - '57c3df061eb1e59d3959cc40'

  2. 从上面选择的Category中,我们得到'Value'数组

  3. 从值数组需要查找第二个值是否等于'ZZZZZ',即。值[1] == 'ZZZZZ'

  4. 现在,在末尾用新值更新匹配的值数组

例如:

[
   "232323",
   "ZZZZZ",
   "1999"
]
should be updated to
    [
   "232323",
   "ZZZZZ",
   "1999",
   "update1"
]

and

[
   "8888",
   "ZZZZZ",
   "1999"
]
should be updated to
[
   "8888",
   "ZZZZZ",
   "1999",
   "update1"
]

我试过如下:

resume.update({
        "Category.CategoryId": new ObjectId('57c3df191eb1e59d3959cc43'), 
        "Category.Value.$.1": 'ZZZZZ'
      },
      {"$set": {"Category.Value.$.3": "update1"}
    }, function(err, resData){
        res.send(resData);
    });

但是,没有任何更新。它有任何方法可以完成这项工作。请帮忙更新内部数组。

提前致谢。

【问题讨论】:

    标签: arrays node.js mongodb mongoose


    【解决方案1】:

    您的目标目前无法实现,因为您需要更新两个位置元素。 这里有一个 JIRA 可跟踪您想要的那种行为:https://jira.mongodb.org/browse/SERVER-831

    这是一个问题,因为您需要匹配两个元素位置:

    1. Category 元素与匹配的CategoryId
    2. Value 数组数组中的 Value 元素

    如果其中之一不是array,那将是可能的。

    无论如何,您上面的update 尝试是错误的。 如果这个功能是可能的(它不是!!!)它会是这样的:

    db.resume.update(
        { 
            Category: {
                $elemMatch: {
                    CategoryId: ObjectId('57c3df061eb1e59d3959cc40'),
                    Value: {
                        $elemMatch: {
                            '1': 'ZZZZZ'
                        }
                    }
                }
            }
        },
        {
            $push: {
                'Category.$.Value.$': 'update1'
            }
        }
    )
    

    $ 位置运算符应在 update 期间使用,而不是像您所做的那样在 find 中使用,它将更新与查询匹配的第一个元素。 执行上述操作会返回错误:

    在路径“Category.$.Value.$”中找到太多位置(即“$”)元素

    由于缺少我在顶部解释的功能。 因此,目前(3.2 版)除非您更改架构,否则您将无法执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2021-10-22
      • 2021-04-03
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多