2014-08-27 86 views
0

我试图在使用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,以便它只能是来自用户的用户?

回答

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 
    } 
}) 

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

+0

一个conversationSchema就是这个计划,你正确地得到了一切。使用像你写的那样的模式是最初的计划,但我不知道如何做查询来显示像Facebook聊天结果。 – 2014-08-27 18:10:28

+0

你想如何显示它?获取两个特定用户之间的聊天记录?只需在查询中指定它们即可获得所有结果。您也可以对创建的时间使用限制。 – wdberkeley 2014-08-27 18:12:01

+0

例如: 'user1 ---> user2:你好 user2 ---> user1:嗨! user2 ---> user1:你好吗? USER1 --->用户2:太好了' 现在,我可以做db.messages.find({发件人:用户1} $其中:{收件人:用户2}),那会只显示: 'USER1 ---> user2:你好 user1 ---> user2:好极了!' 我该如何做查询,以便我可以显示消息,它最初的发送方式。 – 2014-08-27 18:23:24

0

也许is_sender不应该是一个数据类型,而是一个函数(它接受一个用户,然后运行一个查询来确定该用户是否在消息用户之中)。您可能打算让is_sender返回一组用户。在这种情况下,有一种方法可以阻止is_sender作为运行查询以返回结果(用户数组)的函数。