我有类似的东西:
Schema Subdocument
name: String
data: Mixed
Schema Stuff
documents: [Subdocument]
现在,在我的API中有两个端点,一个用于Subdocument
,另一个用于Stuff
。当我想获得Subdocument
时,我需要包含data
字段,但是当我想获得Stuff
时,我想显示这些子文档的名称,但我不知道&#39 ; t想要显示数据字段,因为它非常大而且不会被使用。
因此,为了保持清晰,数据不是私密的。只是当我从Stuff
我试着这样做:
Stuff.findById(id)
.populate("documents")
.populate("-documents.data")
但这不起作用......我在Stuff
的{{1}}包含Subdocument
和name
时获得了data
。当我致电populate("-documents.data")
documents
是一个数组并且我想要排除此数组中每个元素的data
字段时,我觉得我很想告诉猫鼬。
编辑:抱歉,我提供的架构不适合我的情况。就我而言,它不是嵌入式的,而是一个引用,如下所示:
Schema Subdocument
name: String
data: Mixed
Schema Stuff
documents: [{
type: Schema.Types.ObjectId,
ref: 'Subdocument'
}]
答案 0 :(得分:2)
您的文档具有“嵌入式”架构,因此此处不使用populate,它仅用于其他对象位于另一个集合中的“引用”架构。
幸运的是,使用“嵌入式”可以轻松使用投影:
Stuff.findById(id,{ "documents.name": 1 },function(err,results) {
})
结果如
{ "documents": [{ "name": "this" },{ "name": "that" }] }
或.aggregate()
和$map
运营商:
Stuff.aggregate(
[
{ "$match": { "_id": ObjectID(id) } },
{ "$project": {
"documents": {
"$map": {
"$input": "$documents",
"as": "el",
"in": "$$el.name"
}
}
}}
],function(err,results) {
}
)
这只会转换为“仅”名称“值”的数组,这与最后一种形式不同。
{ "documents": ["this", "that"] }
注意,如果使用.aggregate()
,则需要正确转换ObjectId
,因为来自mongoose模式类型的自动播放在聚合管道阶段不起作用。
答案 1 :(得分:2)
假设未嵌入subDocument并使用“ref”,因为您说populate正在运行,但不包括数据部分:
Stuff.findById(id).populate( { "path" : "documents", "select" : "-data" })