数组中的MongoDB $ set项目与对象不存在,因为元素导致对象而不是数组

时间:2019-05-06 06:41:44

标签: mongodb mongodb-query

在数组中更新元素的说明如下:

https://docs.mongodb.com/manual/reference/operator/update/set/#set-elements-in-arrays

但是在文档中似乎缺少文档中尚不存在数组的情况。示例:

如果有此文档:

{
  _id: 'some-id',
  otherprops: 'value'
}

我希望它变成这样:

{
  // ...
  settings: {
    friends: [
      {
        name: 'John Doe',
        age: 28
      }
    ]
  }
  // ...
}

在这种情况下,我不知道是否已经有settings.friends数组。所以我的查询看起来像这样:

{
  $set: {
    'settings.friends.0.name': 'John Doe',
    'settings.friends.0.age': 28
  }
}

但是文档结果如下:

{
  // ...
  settings: {
    friends: {
      0: {
        name: 'John Doe',
        age: 28
      }
    }
  }
  // ...
}

在我的示例中,有没有一种方法可以强制mongodb创建数组而不是对象,而只能使用点符号。

2 个答案:

答案 0 :(得分:1)

  

尝试一下。

{
    $addToSet: {
        "settings.friends": [
            {
                name: 'John Doe',
                age: 28
            }
        ]
    }
}

答案 1 :(得分:0)

这在mongodb v4.0.9版本中有效。我已经在我的机器上测试了您的用例。

db.collection.update(
  {
    "_id": 'your_key'
  },
  {
    "$set": {
      "settings.friends.0.name": "ABCD"
    }
  },
  {
    "upsert": "true"
  }
)

在更新之前,我的收藏条目为

{
    "_id" : 2,
    "col1" : "val01",
    "settings" : {
        "friends" : [
            {
                "name" : "Ramraj",
                "age" : 28
            }
        ]
    }
}

更新后,我的收藏条目为

{
    "_id" : 2,
    "col1" : "val01",
    "settings" : {
        "friends" : [
            {
                "name" : "ABCD",
                "age" : 28
            }
        ]
    }
}