Mongoose Schema:*在之前的对象中

时间:2014-08-27 07:42:32

标签: node.js mongodb mongoose

我正在尝试使用MongoDB和以下架构存储两个用户之间的对话。

`var messageSchema = new Schema({
    users: [
    {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
  {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    }],
  user_msgs: [
  {
      is_sender: {}, //A user in users
      msg_body: String,
      created: {
        type: Date,
        default: Date.now
      }
    }
  ]
});`

有没有办法定义is_sender,以便它只能是来自用户的用户?

2 个答案:

答案 0 :(得分:0)

或许is_sender不应该是数据类型,而是一个函数(接受用户然后运行查询以确定该用户是否在消息users []中)。

也许您打算is_sender返回一组用户。在这种情况下,一种方法是将is_sender作为一个函数来运行查询以返回结果(一组用户)。

答案 1 :(得分:0)

我认为这种架构设计存在一些问题。首先,messageSchema看起来更像conversationSchema,其中包含两个用户之间的大量消息。您可能希望将每条消息都作为文档。此外,数组类型不允许您选择长度 - 您似乎希望在users中限制为两个长度。在这种情况下,只有两个用户字段。用户可以是嵌入式文档,其中包含对用户和可选is_sender字段的引用,或者您可以使用用户字段本身的名称来指示谁是发件人。我认为更好的架构看起来像

var messageSchema = new Schema({
    sender: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    recipient : {
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    msg_body: String,
    created: {
        type: Date,
        default: Date.now
    }
})

虽然这是推测性的,因为我不知道你的完整用例。