我正在使用的文档模型如下。
{
"_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个查询。那里有更好的解决方案吗?
答案 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