mongodb 使用$set创建数组/列表/集合的Pymongo

7dl7o3gd  于 2023-01-12  发布在  Go
关注(0)|答案(2)|浏览(267)

我尝试使用$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是另一种选择,但它不使用点标记法,所以我不能在我的例子中真正使用它)。
谢谢!

2guxujil

2guxujil1#

如果您只想用一条指令来完成它,但从尚未创建任何键开始,这是唯一的方法($set永远不会创建一个不显式的数组,如{$set: {"somekey": [] }}

db.test.update(
  { _id: "(unique id)" },
  { $push: {
    "Information.Class_Info": { "Class_Name": "Math" }
  }}
)

这个查询就完成了这个任务,将一个不存在的键Information.Class_Info,你需要创建一个数组,这是唯一一个可能的解决方案,只需要一条指令,使用点标记法,并且可以工作。

8xiog9wr

8xiog9wr2#

有一种方法可以用一条指令$set和点表示法来完成,如下所示:

db.test.updateOne(
  { _id: "my-unique-id" },
  { $set: { 
    "Information.Class_Info": [ { "Class_Name": "Math" } ] 
  }}
)

还有一种方法可以用两条指令和点标记法中的数组索引来完成,允许您使用类似的语句添加更多的数组元素:

db.test.updateOne(
  { _id: "my-unique-id" },
  { $set: { "Information.Class_Info": [] }}
)
db.test.updateOne(
  { _id: "my-unique-id" },
  { $set: { 
    "Information.Class_Info.0": { "Class_Name": "Math" },
    "Information.Class_Info.1": { "Class_AltName": "Mathematics" } 
  }}
)

偏离这些选项会产生有趣的失效模式:

  • 如果尝试将第二个选项组合到单个updateOne()调用中(这通常是可能的),MongoDB将报告“更新路径'Information.Class_Info.0'将在'Information.Class_Info'处创建冲突”
  • 如果您尝试使用点表示法和数组索引("Information.Class_Info.0.Class_Name": "Math"),但 * 没有 * 先创建一个空数组,那么MongoDB将创建一个带有 numeric 键的对象("0""1",...)。它实际上拒绝创建数组,除非显式地使用[…]answer by @Maximiliano中也有说明)。

相关问题