用另一个列表替换模型子列表(MongoDB或Scala)

时间:2012-11-27 20:01:44

标签: mongodb

我的文档结构如下:

{
   "name":"CategoryChildLevel2",
   "parentId":"2",
   "otherAttribute":"anyVal",
   "breadcrumb":[
      {
         "name":"RootCategory",
         "id":"1"
      },
      {
         "name":"CategoryChildLevel1",
         "id":"2"
      },
      {
         "name":"CategoryChildLevel2",
         "id":"3"
      }
   ]
}

我想要的是能够运行一个说:

的查询

替换以

开头的面包屑数组
      {
         "name":"RootCategory",
         "id":"1"
      },
      {
         "name":"CategoryChildLevel1",
         "id":"2"
      }

替换此子序列
      {
         "name":"RootCategory",
         "id":"1"
      },
      {
         "name":"AnotherCategory",
         "id":"4"
      }
      {
         "name":"AnotherCategory2",
         "id":"5"
      }

以便最终结果是

{
   "name":"CategoryChildLevel2",
   "parentId":"2",
   "otherAttribute":"anyVal",
   "breadcrumb":[
      {
         "name":"RootCategory",
         "id":"1"
      },
      {
         "name":"AnotherCategory",
         "id":"4"
      },
      {
         "name":"AnotherCategory2",
         "id":"5"
      },
      {
         "name":"CategoryChildLevel2",
         "id":"3"
      }
   ]
}

我们可以在MongoDB中执行此操作吗?或者至少检索我们应该更新的项目(array startsWith查询),使用正常的查询语言或map / reduce?

1 个答案:

答案 0 :(得分:1)

从Mongo 2.2开始,您可以在更新的查询选择器中使用数组dot notation来执行此操作:

db.test.update({
    'breadcrumb.0.id': '1',
    'breadcrumb.1.id': '2'
}, {
    $set: {
        'breadcrumb.1': {
            name: "AnotherCategory",
            id: "4"
        }
    }
}, {multi: true})

在以前的版本中,您必须使用update中的$where查询选择器执行此操作,如下所示:

db.test.update({
    'breadcrumb.id': '2',
    // Check the name fields as well here, if necessary.
    $where: "this.breadcrumb.length > 1 && this.breadcrumb[0].id === '1' && this.breadcrumb[1].id === '2'"
}, {
    $set: {
        'breadcrumb.1': {
            name: "AnotherCategory",
            id: "4"
        }
    }
}, { multi: true})

查询的'breadcrumb.id': '2'组件有助于提升效果,因为它会限制慢$where必须操作的文档数量。