mongodb中DBRefs只能向上查找一级吗?

建个三个集合,分别是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的引用在实际的项目开发中用处大吗?有好的文档可以推荐吗?

阅读 1.9k
1 个回答

在MongoDB中寻找JOIN的办法,那可能方向就错了。不是MongoDB不想支持JOIN,问题是分布式环境下的JOIN成本太高,性能和JOIN二选一的话,JOIN就是被放弃那个,毕竟JOIN是可以取代的,性能问题则不是那么好解决。
以上是题外话,就你的问题而言,有什么特别的理由不把score放到student里面吗?这样就可以一次读取查出所有成绩了。

{
    name: "xiaomei",
    phone: 13212345680,
    gender: "girl",
    scores: [
        {math: 97},
        {chinese: 83}
    ]
}

关于MongoDB数据模型设计的问题可以读一下官方文档Data Model Design
对于DBRef,性能上不划算。坚持要用的话仔细检查一下查询:

db.student.findOne({"_id":db.score.findOne().Sid[0].$id})

是没有结果的,原因是DBRef("student", ObjectId("59813e737471c10b2e00838e"))引用的ObjectIdstudent中的ObjectId("59813e997471c10b2e00838e")不一样(仔细看中间)。所以第二条也不可能有结果了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进