将数据插入MongoDB中的嵌套数组

时间:2020-09-28 06:53:18

标签: mongodb mongodb-query

我有一个看起来像这样的文件

{
 _id:1,
 list_id:23,
 name:'list01'
 cards:[
  {
   id:3,
   name:'card01'
   categories:[{
    id:10,
    category:'section01',
    tags:[{id:11,name:'tag01',is_selected: true}]
  }] 
  }
 ]
}

对于给定的 list_id ,我需要在选定的类别标签数组中插入/推送一些数据,但是出现错误说

MongoError:在路径中找到太多位置(即“ $”)元素 'cards。$。categories。$。tags'

这是我尝试过的查询。这个查询有什么问题怎么实现呢?

db.collection(TABLE)
    .updateOne(
      { list_id: 23, 'cards.categories.category': 'section01'},
      { $push: { 'cards.$.categories.$.tags': { name: 'tag02', id: uuidv4(), is_selected: true } } }
    );

3 个答案:

答案 0 :(得分:1)

简而言之,这是不可能的。

嵌套数组

位置$运算符不能用于遍历的查询 一个以上的数组,例如遍历嵌套数组的查询 在其他数组中,因为$占位符的替换是 一个值

https://docs.mongodb.com/manual/reference/operator/update/positional/

但是,您可能要尝试$ []

嵌套数组过滤后的位置运算符$ []可以是 用于遍历多个数组和嵌套数组的查询。

例如,请参阅使用$ []联合更新嵌套数组。

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#position-nested-arrays-filtered

答案 1 :(得分:1)

您可以使用$[identifier]

db.collection.update({
  "list_id": 23,
  "cards.categories.category": "section01"
},
{
  $push: {
    "cards.$.categories.$[elem].tags": {
      name: "tag02",
      id: uuidv4(),
      is_selected: true
    }
  }
},
{
  arrayFilters: [
    {
      "elem.category": "section01"
    }
  ],
  multi: true
})

尝试here

答案 2 :(得分:1)

您不能使用多个$位置,对于您的情况,可以使用单个位置和arrayFilters

过滤后的位置运算符$[<identifier>]标识与arrayFilters条件匹配的数组元素以进行更新操作,

db.collection(TABLE).updateOne({
  list_id: 23,
  "cards.categories.category": "section01"
},
{
  $push: {
    "cards.$.categories.$[elem].tags": {
      name: "tag02",
      id: uuidv4(),
      is_selected: true
    }
  }
},
{
  arrayFilters: [
    { "elem.category": "section01" }
  ]
})

Playground