mongoose排除数组中的字段

时间:2015-08-07 09:15:03

标签: node.js mongodb mongoose mongodb-query

我有类似的东西:

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}}包含Subdocumentname时获得了data。当我致电populate("-documents.data") documents是一个数组并且我想要排除此数组中每个元素的data字段时,我觉得我很想告诉猫鼬。

编辑:抱歉,我提供的架构不适合我的情况。就我而言,它不是嵌入式的,而是一个引用,如下所示:

Schema Subdocument
name: String
data: Mixed

Schema Stuff
documents: [{
    type: Schema.Types.ObjectId,
    ref: 'Subdocument'
}]

2 个答案:

答案 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" })