建个三个集合,分别是student,score,join
db.student.insert({name:"xiaomei",phone:13212345680,gender:"girl"})
db.student.find().pretty()
结果如下:
{
"_id" : ObjectId("59813e997471c10b2e00838e"),
"name" : "xiaomei",
"phone" : 13212345680,
"gender" : "girl"
}
db.score.insert({Sid:[new DBRef('student',ObjectId("59813e737471c10b2e00838e"))],math:97,chinese:83})
db.score.find().pretty()
结果如下:
{
"_id" : ObjectId("598140327471c10b2e008393"),
"Sid" : [
DBRef("student", ObjectId("59813e737471c10b2e00838e"))
],
"math" : 97,
"chinese" : 83
}
db.join.insert({Sid:[new DBRef('score',ObjectId("598140327471c10b2e008393"))],isJoin:false})
db.join.find().pretty()
结果如下:
{
"_id" : ObjectId("598140ec7471c10b2e008394"),
"Sid" : [
DBRef("score", ObjectId("598140327471c10b2e008393"))
],
"isJoin" : false
}
db.student.findOne({"_id":db.score.findOne().Sid[0].$id})
是有结果的db.student.findOne({"_id":db.score.findOne({"Sid":db.join.findOne().Sid[0].$id})})
结果是null,不知道是那里有问题,还请帮忙指正?这种使用DBRefs的引用在实际的项目开发中用处大吗?有好的文档可以推荐吗?
在MongoDB中寻找JOIN的办法,那可能方向就错了。不是MongoDB不想支持JOIN,问题是分布式环境下的JOIN成本太高,性能和JOIN二选一的话,JOIN就是被放弃那个,毕竟JOIN是可以取代的,性能问题则不是那么好解决。
以上是题外话,就你的问题而言,有什么特别的理由不把
score
放到student
里面吗?这样就可以一次读取查出所有成绩了。关于MongoDB数据模型设计的问题可以读一下官方文档Data Model Design。
对于DBRef,性能上不划算。坚持要用的话仔细检查一下查询:
是没有结果的,原因是
DBRef("student", ObjectId("59813e737471c10b2e00838e"))
引用的ObjectId
和student
中的ObjectId("59813e997471c10b2e00838e")
不一样(仔细看中间)。所以第二条也不可能有结果了。