我尝试使用$set来创建一个数组/列表/集合(不确定哪个术语是正确的),我也不知道如何去做。
我有一个文档插入到我的数据库中,看起来像这样:
"_id": (unique, auto-generated id)
"Grade": Sophomore
我想用update来插入一个集合/列表/数组。所以,基本上我想这样:
"_id": (unique, auto-generated id)
"Grade": Sophomore
"Information"{
"Class_Info": [
{"Class_Name": "Math"}
]
到目前为止,我一直在使用. update和点标记法,所以,我尝试使用$set,如下所示:
collection.update({'_id': unique ID}, {'$set': {'Information.Class_Info.Class_Name': 'Math}})
然而,它所做的是使Class_Info成为一个文档,而不是列表/集合/数组,所以它所做的是:
"_id": (unique id)
"Grade": Sophomore
"Information"{
"Class_Info": {
"Class_Name": "Math"
}
如何指定Class_Info是一个列表?如果由于某种原因,我绝对不能使用$set来做这件事,那么我可以使用点标记法是非常重要的,因为我的程序的其余部分是这样工作的,所以如果我应该使用$set以外的东西,它可以使用点标记法来指定在哪里插入列表吗?(我知道$push是另一种选择,但它不使用点标记法,所以我不能在我的例子中真正使用它)。
谢谢!
2条答案
按热度按时间2guxujil1#
如果您只想用一条指令来完成它,但从尚未创建任何键开始,这是唯一的方法($set永远不会创建一个不显式的数组,如
{$set: {"somekey": [] }}
这个查询就完成了这个任务,将一个不存在的键
Information.Class_Info
,你需要创建一个数组,这是唯一一个可能的解决方案,只需要一条指令,使用点标记法,并且可以工作。8xiog9wr2#
有一种方法可以用一条指令
$set
和点表示法来完成,如下所示:还有一种方法可以用两条指令和点标记法中的数组索引来完成,允许您使用类似的语句添加更多的数组元素:
偏离这些选项会产生有趣的失效模式:
updateOne()
调用中(这通常是可能的),MongoDB将报告“更新路径'Information.Class_Info.0'将在'Information.Class_Info'处创建冲突”"Information.Class_Info.0.Class_Name": "Math"
),但 * 没有 * 先创建一个空数组,那么MongoDB将创建一个带有 numeric 键的对象("0"
,"1"
,...)。它实际上拒绝创建数组,除非显式地使用[…]
(answer by @Maximiliano中也有说明)。