猫鼬一次查询所有子文档
Posted
技术标签:
【中文标题】猫鼬一次查询所有子文档【英文标题】:Mongoose one query for all sub documents 【发布时间】:2013-10-21 18:56:58 【问题描述】:这是我的方案,我想做一个query
并获取all documents
和所有对象的文档。
var CureSchema = mongoose.Schema(
id: Number,
therapist: type:mongoose.Schema.Types.ObjectId, ref:'User',
supervisor: type:mongoose.Schema.Types.ObjectId, ref:'User',
parents: type:mongoose.Schema.Types.ObjectId, ref:'User',
children: type:mongoose.Schema.Types.ObjectId, ref:'Child',
startate : Date,
endDate : Date,
deleted: Boolean,
);
var Cure = mongoose.model('Cure', CureSchema);
如果我使用普通查询,我的输出中有objectId
。
"id":0, "therapist":ObjectId("5253cbd8d4fb240000000007"), "supervisor":ObjectId("5253cc9fd4fb24000000000b"), "parents":ObjectId("5253cbdfd4fb240000000008"), "children":ObjectId("5253cb31d4fb240000000001"), "deleted":false, "startate": ISODate("2013-10-08T09:13:06.771Z"), "_id":ObjectId("5253cca2d4fb24000000000c"), "__v":0
【问题讨论】:
您在寻找mongoosejs.com/docs/populate.html吗? 【参考方案1】:您还可以将聚合与 $lookup 一起使用
Cure.aggregate([
"$lookup":
"from": "users",
"localField": "therapist",
"foreignField": "_id",
"as": "therapist"
,
"$lookup":
"from": "users",
"localField": "supervisor",
"foreignField": "_id",
"as": "supervisor"
, ...
])
【讨论】:
【参考方案2】:从技术上讲,在 mongodb 中使用一个查询是不可能的,因为文档属于三个不同的集合。 Mongoose 可能需要进行 5 次查询(虽然我认为 3 次就足够了,但我不确定 Mongoose 有多聪明)。
但是,如果您真正要问的是如何仅使用一条猫鼬指令获取子文档,您应该查看populate()。
Cure.find()
.populate('therapist')
.populate('supervisor')
.populate('parents')
.populate('children')
.exec(resultHandler);
【讨论】:
它工作!!!!但仅适用于儿童,您认为为什么?另一个是 Null OK ok .... 如果在数据库中 objectId 没有数据或 objectIdNull /b> 不正确以上是关于猫鼬一次查询所有子文档的主要内容,如果未能解决你的问题,请参考以下文章