MongoDB嵌套DBRef无法识别$ref/$id的问题求助
MongoDB DBRef 访问失败问题解决
问题场景
Students 集合数据:
{ "FirstName": "Omar", "LastName": "Ali", "IsFired": true, "FacultyID": { "$ref": "Faculty", "$id": "633d5fca2bed487dd7eb4e11", "$db": "FacultySystemV2" }, "CoursesList": [ { "CourseID": { "$oid": "633d5fd62bed487dd7eb4e14" }, "Grade": 95 }, { "CourseID": { "$oid": "633d602c2bed487dd7eb4e15" }, "Grade": 80 } ] }
Faculty 集合数据:
{ "_id": ObjectId('633d5fca2bed487dd7eb4e11'), "FacultyName": "Alex University", "Address": "Alex City" }
执行以下代码无法获取对应 Faculty 数据,甚至直接访问 stds6.FacultyID.$ref 或 stds6.FacultyID.$id 都无结果:
var stds6 = db.Students.findOne({"FirstName": "Omar"}) db[stds6.FacultyID.$ref].findOne({"_id": (stds6.FacultyID.$id)})
问题原因及解决方法
1. 字段访问语法问题
MongoDB shell 中,带$前缀的字段直接用.访问可能出现解析异常,改用方括号语法即可正常读取:
var stds6 = db.Students.findOne({"FirstName": "Omar"}); // 用方括号访问带$的字段 var refCollection = stds6.FacultyID["$ref"]; var refId = stds6.FacultyID["$id"];
2. ID 类型不匹配
Students 里的$id是字符串类型,而 Faculty 的_id是ObjectId类型,直接匹配会失败,必须将字符串转换为ObjectId再查询:
var stds6 = db.Students.findOne({"FirstName": "Omar"}); db[stds6.FacultyID["$ref"]].findOne({"_id": ObjectId(stds6.FacultyID["$id"])});
3. 数据未存储为原生 DBRef 对象
你当前的FacultyID是普通嵌入式文档,而非 MongoDB 原生 DBRef 对象。如果要使用db.dereference()方法直接解析,插入数据时需用DBRef()构造函数创建:
// 插入带原生DBRef的学生数据 db.Students.insertOne({ "FirstName": "Omar", "LastName": "Ali", "IsFired": true, "FacultyID": DBRef("Faculty", ObjectId("633d5fca2bed487dd7eb4e11"), "FacultySystemV2"), "CoursesList": [ { "CourseID": ObjectId("633d5fd62bed487dd7eb4e14"), "Grade": 95 }, { "CourseID": ObjectId("633d602c2bed487dd7eb4e15"), "Grade": 80 } ] }); // 使用dereference直接解析DBRef var stds6 = db.Students.findOne({"FirstName": "Omar"}); db.dereference(stds6.FacultyID);
4. 修正 Faculty 文档语法错误
你提供的 Faculty 原始数据中,_id行末尾缺少逗号,这会导致文档插入失败,必须修正为正确的JSON格式(如前面代码块所示)。
内容的提问来源于stack exchange,提问作者IBdr
相关产品推荐
相关产品推荐

