我正在努力学习mongodb。假设有两个表,它们是相关的。比如像这样 -
1st table has
First name- Fred, last name- Zhang, age- 20, id- s1234
2nd table has
id- s1234, course- COSC2406, semester- 1
id- s1234, course- COSC1127, semester- 1
id- s1234, course- COSC2110, semester- 1
如何在mongo db中插入数据?我是这样写的,不确定是否正确 -
db.users.insert({
given_name: 'Fred',
family_name: 'Zhang',
Age: 20,
student_number: 's1234',
Course: ['COSC2406', 'COSC1127', 'COSC2110'],
Semester: 1
});
提前谢谢
答案 0 :(得分:0)
这是假设您想要建模的内容具有“student_number”和“Semester”,因为它基本上是条目的唯一标识符。但是如果不在代码中累积数组内容,就有办法做到这一点。
您可以在声明中使用少数其他运算符的帮助,在upsert方法中使用.update()
功能。
我将假设你在一个循环中进行此类操作,因此右侧值的所有内容实际上都是一个变量:
db.users.update(
{
"student_number": student_number,
"Semester": semester
},
{
"$setOnInsert": {
"given_name": given_name,
"family_name": family_name,
"Age": age
},
"$addToSet": { "courses": course }
},
{ "upsert": true }
)
这在“upsert”操作中的作用是首先查找您的集合中可能存在的文档,该文档与给定的查询条件相匹配。在这种情况下,“student_number”具有当前“学期”值。
找到匹配项后,文档仅“更新”。所以这里要做的是使用$addToSet
运算符,以便只将“唯一”值“更新”到“courses”数组元素中。这对于拥有独特课程似乎是有意义的,但如果不是您的情况,那么您当然可以简单地使用 $push
运算符。这就是每次都要进行的操作,无论文档是否“匹配”。
如果未找到“匹配”文档,则会将新文档插入到集合中。这是$setOnInsert
运算符的来源。
因此,该部分的重点是,在创建新文档时将仅被调用,因为不需要每次都使用相同的信息更新这些字段。除此之外,您在查询条件中指定的字段具有显式值,因此“upsert”的行为是在新创建的文档中自动创建具有这些值的字段。
创建新文档后,使用相同条件的下一个“upsert”语句当然只会“更新”现有文档,因此只会添加新课程信息。
这样的总体工作允许您使用适当的查询从源中“预加入”两个表。然后你只是循环结果而不需要编写代码来尝试将正确的条目组合在一起,只需让MongoDB为你做累积工作。
当然,您可以随时编写代码来自行完成此操作,这样可以减少数据库的“跳闸”次数,以便插入已经累积的记录(如果符合您的需求)。
最后需要注意的是,虽然它确实需要一些额外的复杂性,但您可以通过使用新引入的"batch updates"功能来提高操作性能。为此,您的MongoDB服务器版本需要为2.6或更高。但这是仍然减少逻辑的一种方法,同时保持较少的实际“线上”写入数据库。
答案 1 :(得分:0)
您可以拥有两个单独的集合 - 一个包含学生详细信息,另一个包含课程,并将其与“id”链接。 否则,您可以将一个文档作为内部文档以数组形式包含在单个文档中,如下所示:
{
"FirstName": "Fred",
"LastName": "Zhang",
"age": 20,
"id": "s1234",
"Courses": [
{
"courseId": "COSC2406",
"semester": 1
},
{
"courseId": "COSC1127",
"semester": 1
},
{
"courseId": "COSC2110",
"semester": 1
},
{
"courseId": "COSC2110",
"semester": 2
}
]
}