第一部分:
I have (student) collection:
{
sname : "",
studentId: "123"
age: "",
gpa: "",
}
我试图从中只获得两个键:
{
sname : "",
studentId: "123"
}
所以我需要消除年龄和gpa只有名字和学生编号,我怎么能做到这一点?
第二部分:
然后我有'subject'集合:
{
subjectName : "Math"
studentId : "123"
teacherName: ""
}
我需要匹配/组合前面的键(在part1中)与正确的studentId,所以我最终会得到这样的东西:
{
sname : "",
studentId: "123",
subjectName : "Math"
}
我怎么能做到这一点,这是正确的方式来思考得到的结果?我试着阅读关于组和mapReduce,但我没有找到一个明确的例子。
回答你的第一个问题,你可以这样做:
db.student.find({}, {"sname":1, "studentId":1});
其中的第一个{}是限制查询,在本例中包括整个集合。后半部分指定带有1或0的键,这取决于您是否想要返回它们。但是,不要在单个查询中混合包含和排除。除少数特殊情况外,蒙古不接受。
你的第二个问题更难。你要求的是一个连接,而mongo不支持这个。没有办法连接studentId上的两个集合。您需要找到您想要的所有学生,然后使用这些studentid找到所有匹配的科目。然后,您需要在自己的代码中合并这两个结果。你可以通过你使用的任何驱动程序来实现,或者你可以在shell本身的javascript中实现,但无论哪种方式,你都必须将它们与你自己的代码合并。
编辑:下面是一个示例,说明如何在shell中执行此操作,并将输出输出到一个名为"out"的集合。
db.student.find({}, {"sname":1, "studentId":1}).forEach(
function (st) {
db.subject.find({"studentId":st.studentId}, {"subjectName":1}).forEach(
function (sub) {
db.out.insert({"sname":st.sname, "studentId":st.studentId, "subjectName":sub.subjectName});
}
);
}
);
如果这不是经常更改的数据,您可以删除"out"集合,并定期使用此shell脚本重新填充它。然后你的代码可以直接从"out"进行查询。如果数据经常更改,您将希望在代码中动态地进行合并。
另一个可能更好的选择是将"subject"数据包含在"student"集合中,反之亦然。这将产生一个更加mongodb友好的结构。如果您经常遇到这种连接问题,mongo可能不是最好的选择,关系数据库可能更适合您的需求。
Mongo的find()
运算符允许您从结果中包含或排除某些字段
查看文档中的字段选择以获取更多信息。你可以这样做:
db.users.find({}, { 'sname': 1, 'studentId': 1 });
db.users.find({}, { 'age': 0, 'gpa': 0 });
要将学生和科目联系在一起,您可以分别查找学生的科目,如下所示:
db.subjects.find({ studentId: 123 });
或者在每个学生中嵌入主题数据,并将其与学生文档一起检索:
{
sname : "Roland Browning",
studentId: "123"
age: 14,
gpa: "B",
subjects: [ { name : "French", teacher: "Mr Bronson" }, ... ]
}