更新另一个没有密钥的数组中的数组内容

时间:2016-10-05 06:08:43

标签: arrays node.js mongodb mongoose

我有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"
               ]
            ]
         }
      ]
   }
]

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

我需要

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

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

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

  4. 现在,使用最后一个新值更新匹配的值数组

  5. 例如:

    [
       "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);
        });
    

    但是,没有任何更新。它有什么办法让这项工作。请帮助更新内部数组。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

  1. 匹配Category
  2. CategoryId元素
  3. Value数组数组中的Value元素
  4. 如果其中一个不是array,那就可能了。

    无论如何,你的update尝试上面的错误。 IF 此功能是可行的(并且它不是!!! ),它可能是这样的:

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

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

      

    在路径'类别。$。值。$'

    中找到太多位置(即'$')元素

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