【问题标题】:mongoose-schema - are both children array + parent doc's ID necessary?mongoose-schema - 是否需要子数组+父文档的 ID?
【发布时间】:2018-02-02 15:18:51
【问题描述】:

我正在使用几个一对多模型,并且想知道在孩子中同时拥有一组“子”ObjectID() 和“父”模型的 ObjectID() 的优势是什么。例如:

// a client will have a new card every ten visits
var ClientSchema = new Schema({
    first_name: String,
    last_name: String,
    email: String,
    cards: [] // ObjectID()s, <--- is this necessary?
});

var CardSchema = new Schema({
    client: ObjectID(), // <--- or is this enough?
    visits: []
});

我认为 client: ObjectID() 在大多数情况下应该可以解决问题,尤其是 Mongoose 提供的人口选项。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema database


    【解决方案1】:

    将引用 ObjectId 存储在其中一个文档中就足够了。

    您可以在文档或this answer 中阅读,参考字段需要typeref。字段的名称是任意的。完成此操作并注册模型后,您可以使用模型来填充查询。

    var clientSchema = new Schema({
        first_name: String,
        last_name: String,
        email: String
    });
    
    var cardSchema = new Schema({
        client: {
            type: Schema.Types.ObjectId,
            ref: 'client'
        }
    });
    
    // models
    var Card = mongoose.model('Card', cardSchema);
    var Client = mongoose.model('Client', clientSchema);
    

    然而,存储 ObjectId 的数组可能会有所帮助。然而,这也为错误创造了一个巨大的窗口。 SQL 方言中的外键和主键不匹配。如果需要计数,您可以随时进行计数查询。我会说,要么执行上述操作,要么执行此操作:

    var clientSchema = new Schema({
        first_name: String,
        last_name: String,
        email: String,
        cards: [
            {
                type: Schema.Types.ObjectId,
                ref: 'card'
            }
        ]
    });
    
    var cardSchema = new Schema({
        card_name: String
    });
    
    // models
    var Card = mongoose.model('Card', cardSchema);
    var Client = mongoose.model('Client', clientSchema);
    

    【讨论】:

    • 太棒了!谢谢@PimHeijden!我遇到的每个示例都使用两者,知道为什么吗?也许只进行一次查询,仍然可以访问cards 数组的长度?
    • 谢谢!我现在可以发表评论了。这是我的第一条评论 XO
    猜你喜欢
    • 1970-01-01
    • 2018-02-09
    • 2016-11-08
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多