为何Parse能映射MongoDB的_id为objectId却无法通过get方法获取文档?
问题描述
我有一个非Parse创建的现有MongoDB数据库,希望对接Parse Server使用。theaters集合中文档结构示例如下:
{ "_id": "59a47286cfa9a3a73e51e72c", "theaterId": 1000, "location": { "address": { "street1": "340 W Market", "city": "Bloomington", "state": "MN", "zipcode": "55425" }, "geo": { "type": "Point", "coordinates": [-93.24565, 44.85466] } } }
使用ParseQuery执行find查询时能正常返回结果,Parse会自动将MongoDB的_id字段映射为objectId:
查询代码:
const query = new Parse.Query("theaters"); const theaters = await query.find();
查询结果:
[ { "theaterId": 1000, "location": { "address": { "street1": "340 W Market", "city": "Bloomington", "state": "MN", "zipcode": "55425" }, "geo": { "type": "Point", "coordinates": [-93.24565, 44.85466] } }, "objectId": "59a47286cfa9a3a73e51e72c" }, { "theaterId": 1003, "location": { "address": { "street1": "45235 Worth Ave.", "city": "California", "state": "MD", "zipcode": "20619" }, "geo": { "type": "Point", "coordinates": [-76.512016, 38.29697] } }, "objectId": "59a47286cfa9a3a73e51e72d" } ]
但使用返回的objectId调用get方法获取单个文档时,却报错:
No object found
查询代码:
let singleTheaterQuery = new Parse.Query("theaters"); let singleTheater = await singleTheaterQuery.get("59a47286cfa9a3a73e51e72d");
原因分析
- Parse的
find和get方法处理逻辑不同:find是在返回结果阶段将MongoDB的_id映射为objectId,但查询过程中并没有修改查询条件;而get方法会直接构造查询条件,去匹配文档中的objectId字段,但现有文档是Parse外创建的,不存在这个字段,因此查询不到。 - Parse默认的字段映射仅作用于结果返回阶段,查询阶段仍遵循Parse的标准字段规则(用
objectId作为主键查询),不会自动将objectId查询条件映射到MongoDB的_id字段。
解决方案
方案1:批量给现有文档添加objectId字段
直接在MongoDB中执行更新命令,让objectId字段的值与_id保持一致:
db.theaters.updateMany({}, [{$set: {objectId: "$_id"}}])
执行完成后,Parse的get方法就能通过返回的objectId正常查询到文档。
方案2:配置Parse Server的自定义字段映射
在初始化Parse Server时,为theaters类配置字段映射,指定objectId对应MongoDB的_id字段:
const parseServer = new ParseServer({ // 其他基础配置(数据库连接、应用ID等) schema: { theaters: { fields: { objectId: { type: "String", targetName: "_id" // 将Parse的objectId映射到Mongo的_id字段 } } } } });
配置后,Parse在处理get查询时,会自动将objectId的查询条件转换为匹配MongoDB的_id字段,无需修改现有数据。
方案3:改用equalTo查询单个文档
如果不想修改数据或配置,可以直接通过_id字段查询单个文档,替代get方法:
let singleTheaterQuery = new Parse.Query("theaters"); // 直接匹配MongoDB的_id字段 singleTheaterQuery.equalTo("_id", "59a47286cfa9a3a73e51e72d"); let singleTheater = await singleTheaterQuery.first();
该方法通过直接查询MongoDB原生的_id字段,能获取到目标文档。
内容的提问来源于stack exchange,提问作者ololo
相关产品推荐
相关产品推荐

