MongoDB中能否通过记录B的ObjectID直接获取关联用户对象?
MongoDB ObjectID关联场景的查询方式
在你给出的场景里,默认情况下直接查询记录B只能拿到user字段对应的ObjectID值,没法直接获取完整的用户对象,必须用这个ID单独查询用户集合才能拿到记录A的内容。
不过MongoDB提供了聚合查询功能,可以一次性关联两个集合并返回包含用户对象的结果,不用分两次查询:
使用$lookup聚合操作符
通过$lookup可以在查询记录B的同时,关联用户集合并拉取对应的用户数据,示例代码如下:
db.collectionB.aggregate([ // 先匹配到目标记录B { $match: { _id: ObjectId("62e14880ad84f0acd54ae930") } }, // 关联用户集合 { $lookup: { from: "collectionA", // 存储用户数据的集合名称 localField: "user", // 记录B中存用户ObjectID的字段 foreignField: "_id", // 用户集合的主键字段 as: "userInfo" // 用来存储关联结果的字段名 } }, // 把数组格式的关联结果转为单个对象(如果确定是一对一关联的话) { $unwind: "$userInfo" } ])
执行这个查询后,返回的结果里会包含记录B的所有字段,以及userInfo字段,里面就是完整的记录A对象。
用ODM框架简化操作
如果是用Mongoose这类ODM工具,还可以在定义Schema时设置关联关系,查询时直接用populate方法获取关联对象:
// 定义用户Schema const userSchema = new mongoose.Schema({ name: String }); const User = mongoose.model('User', userSchema); // 定义记录B的Schema,指定user字段关联User const recordBSchema = new mongoose.Schema({ title: String, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } }); const RecordB = mongoose.model('RecordB', recordBSchema); // 查询时直接populate拉取用户对象 RecordB.findById("62e14880ad84f0acd54ae930").populate('user').exec((err, doc) => { // doc.user就是完整的用户对象 });
内容的提问来源于stack exchange,提问作者donzee529
相关产品推荐
相关产品推荐

