【问题标题】:mongoose exclude field in arraymongoose 排除数组中的字段
【发布时间】:2015-08-07 17:57:51
【问题描述】:

我有类似的东西:

Schema Subdocument
name: String
data: Mixed

Schema Stuff
documents: [Subdocument]

现在,在我的 API 中有两个端点,一个用于Subdocument,另一个用于Stuff。当我想获得Subdocument 时,我需要包含data 字段,但是当我想获得Stuff 时,我想显示这些子文档的名称,但我不想显示数据字段因为比较大,不会用。

因此,为了清楚起见,数据不是私有的。只是从Stuff得到的时候不想显示出来

我尝试过这样做:

Stuff.findById(id)
     .populate("documents")
     .populate("-documents.data")

但这不起作用......我得到了StuffSubdocument,其中包含namedata。当我调用populate("-documents.data") documents 是一个数组并且我想为这个数组中的每个元素排除data 字段时,我觉得我想告诉猫鼬。

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

Schema Subdocument
name: String
data: Mixed

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

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    假设 subDocument 没有嵌入并使用“ref”作为您所说的填充工作,但不包括数据部分:

    Stuff.findById(id).populate( { "path" : "documents", "select" : "-data" })
    

    【讨论】:

    • 太好了,这行得通。我之前试过这个,但我正在编辑 findById() 并从 API 调用 getAll() 方法来测试它,所以我看不到任何结果。非常感谢!
    【解决方案2】:

    您的文档具有“嵌入”模式,因此此处不使用填充,它仅用于其他对象位于另一个集合中的“引用”模式。

    幸运的是,“嵌入”有一种使用投影的简单方法:

    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 模式类型自动转换在聚合管道阶段不起作用。

    【讨论】:

    • 我很抱歉我的问题......正如 Hiren 所说,它不是嵌入的,我只是复制错误。这是一个参考......这是我不知道该给谁回答的情况之一......
    • @olivarra1 让我们把它归结为如何提出问题的学习经验。您最初使用的语法“暗示”了一个嵌入式模式,因为这是您在代码中定义一个模式的方式。下次您提出问题时,请复制代码的相关部分。例如您的实际架构定义。另请注意,在此处接受其他答案之前,您甚至没有添加该信息。
    猜你喜欢
    • 2017-10-16
    • 2018-07-22
    • 2015-01-10
    • 1970-01-01
    • 2021-11-13
    • 2013-02-07
    • 2022-01-11
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多