Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose架构:*在上一个对象中_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose架构:*在上一个对象中

Node.js Mongoose架构:*在上一个对象中,node.js,mongodb,mongoose,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:

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

也许Is_sender不应该是数据类型,而是一个函数,它接受一个用户,然后运行一个查询来确定该用户是否属于消息用户[]


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

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

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

尽管这是推测性的,因为我不知道您的全部用例。

一个对话模式正是计划,您正确地理解了所有内容。最初的计划是使用您编写的模式,但我不知道如何进行查询以显示facebook聊天等结果。您希望如何显示它?获取两个特定用户之间的聊天?只需在查询中同时指定它们即可获得所有结果。您也可以对创建时间使用限制。例如:user1-->user2:Hello user2-->user1:Hi!用户2-->用户1:你好吗?用户1-->用户2:太好了!现在,我可以执行db.messages.find{sender:user1}$where:{recipient:user2},它只显示:user1-->user2:Hello user1-->user2:Great!如何进行查询,以便显示邮件,邮件最初的发送方式。我想您不关心查询谁是发件人,谁不是,因此您可以使用始终大小为2的数组,并在数组中查询发件人、收件人,然后按创建时间排序。您还可以在第二个子句中使用$or查询并翻转发件人和收件人。