【问题标题】:Create an independent user schema and also embed it in a message schema with Mongoose/MongoDB?创建一个独立的用户模式并将其嵌入到 Mongoose/MongoDB 的消息模式中?
【发布时间】:2014-08-18 01:01:43
【问题描述】:

我有一个用户模式和一个消息模式,它们目前是分开的,但应该是相关的。

var schemaUser = new Schema({
    username: String,
    encryptPass: String,
    created: Date
});

var schemaMessage = new Schema({
    from: String,
    to: [String],
    message: String,
    created: Date
});

是否可以独立于消息模式创建用户模式,然后将其嵌入到消息模式的“to:”字段中的数组中?

var schemaMessage = new Schema({
    from: String,
    to: [schemaUser],
    message: String,
    created: Date
});

从那里开始,'to:' 字段中的每个嵌入式用户文档是否可以具有不同的嵌入式 'views:' 文档以及与每条消息的每个用户相关的其他字段?

这是否代表多个嵌入式用户的不同“查看”和“阅读”标准

var schemaMessage = new Schema({
    from: String,
    to: [
                {
                    schemaUser
                },
                {
                    view: {
                        inbox: Boolean,
                        outbox: Boolean,
                        archive: Boolean
                    }
                },
                {
                    read: {
                        marked: Boolean,
                        datetime: Date
                    },
                }
            ],
    message: String,
    created: Date
});

【问题讨论】:

  • 您的第二个列表完全有效。不过,不确定您对第三个列表的了解是什么,这是无效的。为什么这些部分会成为“to”字段的一部分?当然,它们会是消息或其他东西的属性。
  • @NeilLunn 对于第三个,在 to: 字段中可能有多个用户,每个用户可能对邮件进行了不同的分类(收件箱/存档/垃圾箱..等),每个用户都标记了消息在不同的时间点阅读。如何最好地表示这些因素?

标签: javascript node.js mongodb mongoose nosql


【解决方案1】:

您似乎想要一些基本上抽象“用户”的东西,其中包含一些特定于该用户在消息中的状态的自定义属性:

var schemaUser = new Schema({
    username: String,
    encryptPass: String,
    created: Date
});

var schemaUserMessage = new Schema({
    user: { "type": Schema.ObjectId, "ref": "User" }
    username: String,
    view: {
        inbox: Boolean,
        outbox: Boolean,
        archive: Boolean
    },
    read: {
        marked: { "type": Boolean, default: false },
        date: Date
    }
}); 

var schemaMessage = new Schema({
    from: String,
    to: [schemaUserMessage],
    message: String,
    created: Date
});

var User = mongoose.model( "User", userSchema );
var Message = mongoose.model( "Message", messageSchema );

因此,仍然嵌入的中间架构定义具有与其特定数据“视图”相关的属性信息,并保留有关适当用户的一些信息。

“用户名”在此上下文中保持嵌入是有意义的,因为您将经常使用它并且不希望从外部模型填充。但是“整个”用户对象实际上可能比显示的字段更多,因此每次都嵌入并没有多大意义。

您仍然保留引用,因此如果您需要获取更多详细信息,可以从 _id 轻松引用该信息,该信息将针对外部架构的“用户”保留。

此外,所有这些属性都正确定义为“to”部分中每个用户的数组元素的成员,这正是您想要的。

【讨论】:

  • 非常非常酷。真的很感谢最近所有的答案。真的很感激,
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2013-12-11
  • 2018-09-29
  • 2013-03-03
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多