如何在mongodb中的数组子文档中更新或插入许多对象?

时间:2017-08-05 07:02:17

标签: arrays mongodb

我正在使用的文档模型如下。

{
    "_id" : "a301c595-f6f3-4ede-91c5-f1cabd548338",
    "UserName" : "3@3.com",
    "Revision" : 6,
    "UserVocabs" : [
        {
            "Vocab" : "apple",
            "LearnStatus" : 0,
            "lastChanged" : 213232
        },
        {
            "Vocab" : "book",
            "LearnStatus" : 0,
            "lastChanged" : 213132
        },
    ]
}

我正在尝试通过Vocab字段在UserVocabs数组中添加或替换对象,因此我不知道它们的索引。到目前为止,我使用的唯一解决方案是首先拉动对象,然后尝试将其更新版本推回到阵列中。但每个对象更新需要2个查询。那里有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以通过其索引更新数组中的一个元素,如

 db.test.update({"_id": "a301c595-f6f3-4ede-91c5-f1cabd548338"},{$set:{"UserVocabs.1.Vocab":"orange"}})

或者,如果要修改所有元素,可以将1替换为$ db.test.update({"_id": "a301c595-f6f3-4ede-91c5-f1cabd548338"},{$addToSet:{"UserVocabs":{"key1":"value1","key2":"value2"}}}) 是任意索引的通配符。 (你可能必须设置最后两个参数标签才能使其工作)

并可以使用

扩展数组
db.test.update({"UserVocabs.Vocab": "apple"},{$set:{"UserVocabs.$.Vocab":"orange"}})

可移除元素可以参考this answer

如果你想使用数组的值找到要替换的elem,你可以:

lgl@pGentoo ~ $ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb5
  VG Name               pika
  PV Size               150.00 GiB / not usable 1.69 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              38400
  Free PE               0
  Allocated PE          38400
   PV UUID               O1Db1I-zXss-5OLP-nlN6-OUFH-oqDf-8UjOFY

  --- Physical volume ---
  PV Name               /dev/sda7
  VG Name               pika
  PV Size               20.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               235
  Allocated PE          4884
  PV UUID               4Hy6zL-gcpi-aRmI-GeUB-rEsw-Sa3R-Fd4Kpb