【问题标题】:Update not inserting a object in subarray,when upsert=true当 upsert=true 时更新不在子数组中插入对象
【发布时间】:2013-10-23 02:08:07
【问题描述】:

我正在使用 upsert=true 的 mongodb 更新方法。

我的数据如下所示:

{"my_id":"1",
"test_list":[{"test_id":1,"test_name":"pppp"}]}

现在我正在使用以下命令:

db.testcol.update({"my_id":1,"test_list.test_id":2},{"$set":{"test_list.$.test_name":"mmmm"}},true,true)

现在我想在“test_list”中插入一个新对象,因为它不存在

但我得到了错误:

Cannot apply the positional operator without a corresponding query field containing an array.

我的操作不能使用“插入”,因为我不知道数据是他们的并且该字段需要更新,还是不是他们的并且需要插入(第一次)

【问题讨论】:

标签: mongodb mongoose mongo-java


【解决方案1】:

Upserts 用于当您希望更新工作时,无论整个文档是否存在,而不仅仅是一个数组元素。对于数组元素的情况,您可以使用$addToSet:

db.testcol.update(
    {"my_id": "1"},
    {"$addToSet": {"test_list": {"test_id": 2, "test_name": "mmmm"}}})

如果匹配的元素尚不存在,它只会将新元素添加到文档的 test_list 数组字段中。

【讨论】:

  • @PhalguniMukherjee 这意味着您的集合中至少有一个文档,其中test_list 不是数组。
  • "$addToSet" 每次在数组中添加一个新对象,但我不知道是添加一个对象还是更新一个字段。
  • @PhalguniMukherjee 不确定会发生什么,但正如文档所说:$addToSet 运算符仅在值不在数组中时才将值添加到数组中
猜你喜欢
  • 2013-09-30
  • 1970-01-01
  • 2019-09-07
  • 2017-01-16
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2021-06-02
  • 2013-02-23
相关资源
最近更新 更多