使用curs更新嵌套的mongodb集合

2024-05-16 19:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我是mongodb的新手,正在使用它来存储嵌套文档。E、 g.每个文档包含每个班级的学生数组。我正在尝试更新每个阵列节点中的信息。有没有更好的方法来代替每次更新一个数组元素?在

这是我收藏的记录-

{
    “_id” : “23343” ,
    “class” : “Physics”,
    “students”: [ 
        { “id” : “2412” , “name” : "Alice", “mentor” : 0 },
        { “id” : “2413” , “name” : "Bob, “mentor” : 0 },
    ]
} 

集合中有多个这样的记录。在

我有这些课程的清单,我需要为每个记录更新。例如,我让一个学生数组来更新上面的记录-

^{pr2}$

更新记录的最佳方式是什么?在

我用的是python。直观地说,我可以对课程集合执行find()。我得到了一个光标。我可以为光标中的每一个做一个。我相信mongodb会在update()上更新整个文档。在

for record in courseCollection.find():
    recordId = record['_id']
    updatedList = getUpdatedStudentList( record['students'])
    updatedRecord = prepareUpdatedRecord(updatedList)
    courseCollection.update( {'_id' : recordId}, updateList)

pymongo文档站点不讨论update函数中的set选项。除非我使用它,否则我相信mongodb会更新整个文档。在

另外,通过传入\u id来使用查询选项调用update似乎没有必要,因为我只是执行了查询并拥有了记录的句柄。我是否可以使用光标在那里进行更新,而不再进行更新的查询?在


Tags: name文档idmongodb记录update数组find
2条回答

我不太清楚问题到底是什么。简而言之:是的,您必须更新“parent”对象,是的,您可以使用$set或替换整个文档,这将是默认行为。区别主要是锁、并发和所有权问题,这有点复杂。以下是您的一些顾虑的详细信息:

Updating a nested mongodb collection using a cursor

请注意,没有“嵌套集合”,只有嵌入的文档。这很重要,因为mongodb中的第一类公民总是实际的文档本身。例如,find()将返回文档,而不是仅返回嵌入文档的子集。你可以做预测,但这只是一个输出转换,可以说。在

I can do a find() on the collection for the course. I get a cursor for that.

您得到了一个游标,但是由于您查询的是主键,因此只能有一个匹配项(主键是唯一的),也就是说,您可以使用findOne(),并且不需要迭代单个结果。在

E.g. Each document contains an array of students for each class.

这些通常应该是学生的参考资料,也就是说,应该有一个单独的学生集合,因为你不想因为学生暂时没有被分配到任何课程而失去学生。在

The pymongo documentation site does not talk about the set option in the update function. Unless I use that I believe mongodb updates the whole document.

这是真的。您可以对文档的students数组执行$set。这样可以避免重写任何其他字段,例如class。另一方面,如果在您编辑学生时其他人更改了class,那么这些更新是否仍然有意义?所有权不明确是我对嵌入文档的主要顾虑。在

Also calling update with a query option by passing in the _id seems unnecessary because I just did the query and have a handle to the record

…但究竟什么是记录的句柄?句柄是一个不可变的、唯一的、通常很短的标识符。就像id一样,_id是句柄。我不懂python,但我想您可以编写一个方法,它获取指向数据库对象的指针并执行更新,因为知道每个数据库对象都必须有一个名为_id的字段。但是从数据库的角度来看,代码中的指针不是句柄,而是id。在

您可以在更新中将the $ operator与$elemMatch一起使用。我们先插入文档:

collection.insert({
    "_id": "23343",
    "class": "Physics",
    "students": [
        {"id": "2412", "name": "Alice", "mentor": 0},
        {"id": "2413", "name": "Bob", "mentor": 0}]})

现在我将运行两个更新语句,首先添加导师“Mark”,然后添加“Jackson”:

^{pr2}$

每个update语句只影响“students”数组中一个子文档的“mentor”字段。在

相关问题 更多 >