mongoose-schema - 是不是需要子数组+父文档的 ID?

Posted

技术标签:

【中文标题】mongoose-schema - 是不是需要子数组+父文档的 ID?【英文标题】: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 提供的人口选项。

【问题讨论】:

【参考方案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

以上是关于mongoose-schema - 是不是需要子数组+父文档的 ID?的主要内容,如果未能解决你的问题,请参考以下文章

SubSelectionRequired 类型的验证错误:字段时间戳类型需要子选择

需要子查询帮助

需要子查询条件输出

需要子表单时,条件格式会闪烁

文件结构:在 Node.js 中需要子模块

Django 查询集过滤器(可能需要子查询)