我是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似乎没有必要,因为我只是执行了查询并拥有了记录的句柄。我是否可以使用光标在那里进行更新,而不再进行更新的查询?在
我不太清楚问题到底是什么。简而言之:是的,您必须更新“parent”对象,是的,您可以使用
$set
或替换整个文档,这将是默认行为。区别主要是锁、并发和所有权问题,这有点复杂。以下是您的一些顾虑的详细信息:请注意,没有“嵌套集合”,只有嵌入的文档。这很重要,因为mongodb中的第一类公民总是实际的文档本身。例如,
find()
将返回文档,而不是仅返回嵌入文档的子集。你可以做预测,但这只是一个输出转换,可以说。在您得到了一个游标,但是由于您查询的是主键,因此只能有一个匹配项(主键是唯一的),也就是说,您可以使用
findOne()
,并且不需要迭代单个结果。在这些通常应该是学生的参考资料,也就是说,应该有一个单独的学生集合,因为你不想因为学生暂时没有被分配到任何课程而失去学生。在
这是真的。您可以对文档的
students
数组执行$set
。这样可以避免重写任何其他字段,例如class
。另一方面,如果在您编辑学生时其他人更改了class
,那么这些更新是否仍然有意义?所有权不明确是我对嵌入文档的主要顾虑。在…但究竟什么是记录的句柄?句柄是一个不可变的、唯一的、通常很短的标识符。就像id一样,
_id
是句柄。我不懂python,但我想您可以编写一个方法,它获取指向数据库对象的指针并执行更新,因为知道每个数据库对象都必须有一个名为_id
的字段。但是从数据库的角度来看,代码中的指针不是句柄,而是id。在您可以在更新中将the $ operator与$elemMatch一起使用。我们先插入文档:
现在我将运行两个更新语句,首先添加导师“Mark”,然后添加“Jackson”:
^{pr2}$每个update语句只影响“students”数组中一个子文档的“mentor”字段。在
相关问题 更多 >
编程相关推荐