Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.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
Javascript 如何从一个单独的集合中获取数据并将其与一个用户集合连接,而不必使用相同的公共id在MongoDB中链接这两个集合?_Javascript_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript 如何从一个单独的集合中获取数据并将其与一个用户集合连接,而不必使用相同的公共id在MongoDB中链接这两个集合?

Javascript 如何从一个单独的集合中获取数据并将其与一个用户集合连接,而不必使用相同的公共id在MongoDB中链接这两个集合?,javascript,mongodb,express,mongoose,Javascript,Mongodb,Express,Mongoose,我在MongoDB中有两个集合,即用户和字典。 我正在构建一个简单的字典、简单的表单和表格,用户可以在其中存储他们所学的任何单词。 我还为web应用程序构建了身份验证,因此只有注册用户才能访问字典表 我的问题是我不知道如何链接这两个集合,因为我没有共同的 属性来执行查找函数。我想做的基本上是,每当用户登录时,他/她的字典集合中的数据都会呈现在表中 我是否需要在两个集合中创建一个冗余的公共属性/id?否 用户和字典模式如下所示;应该在两个集合中自动创建_id,但我认为这两个id并不相同 c

我在MongoDB中有两个集合,即用户和字典。 我正在构建一个简单的字典、简单的表单和表格,用户可以在其中存储他们所学的任何单词。 我还为web应用程序构建了身份验证,因此只有注册用户才能访问字典表

我的问题是我不知道如何链接这两个集合,因为我没有共同的 属性来执行查找函数。我想做的基本上是,每当用户登录时,他/她的字典集合中的数据都会呈现在表中

我是否需要在两个集合中创建一个冗余的公共属性/id?否

用户和字典模式如下所示;应该在两个集合中自动创建_id,但我认为这两个id并不相同

    const userSchema = mongoose.Schema({
      joindate: {
        type: Date,
      },
      fullname: {
        type: String,
      },
      email: {
        type: String,
      },
      password: {
        type: String,
      },
      dateofbirth: {
        type: Date,
      },
    });

  const dictionarySchema = mongoose.Schema({
  word: {
    type: String,
  },
  meaning: {
    type: String,
  },
  example: {
    type: String,
  },
  language: {
    type: String,
  },
  date: {
    type: Date,
  },
});

您有自己的答案,是的,您需要创建一个公共字段/id,这将帮助我们将每个用户映射到他们保存的单词

如果您担心在DB中存储公共字段/id两次,那么可以使用类似的模式,如下所示:

userSchema = {
  joindate:,
  fullname:,
  email:,
  password:,
  dateofbirth:
  dictionaries: [{
    word:,
    meaning:,
    example:,
    language:,
    date:,
  }]
}
users集合将具有dictionaries字段,您可以在其中推送该特定用户存储的所有单词。您不需要进行任何查找。因为MongoDB是一个NoSQL数据库,所以根本没有关系。你是一只自由的鸟

更新: 我所说的公共域是指用户名或用户ID之类的东西。我相信只有登录的用户才能存储这些文字。然后,您可以获取登录用户的用户名,并将其与单词的其他详细信息一起存储在字典集合中。因此,更新后的模式如下所示:

userSchema = {
  joindate:,
  fullname:,
  email:,
  password:,
  dateofbirth:
  dictionaries: [{
    word:,
    meaning:,
    example:,
    language:,
    date:,
  }]
}
const userSchema=mongoose.Schema{ 用户名:{ 类型:字符串, }, 加入日期:{ 类型:日期, }, 全名:{ 类型:字符串, }, 电邮:{ 类型:字符串, }, 密码:{ 类型:字符串, }, 出生日期:{ 类型:日期, }, }; const dictionarySchema=mongoose.Schema{ 用户名:{ 类型:字符串, }, 字:{ 类型:字符串, }, 意思是:{ 类型:字符串, }, 例如:{ 类型:字符串, }, 语言:{ 类型:字符串, }, 日期:{ 类型:日期, }, }; 您可以通过两种方式进行链接

您可以将对字典模型的引用存储在用户模型中,作为一个引用数组。然后您将能够获取用户及其字典 字典:[{type:mongoose.Schema.ObjectId,ref:}]

然后,您可以使用populate与用户一起获取字典

UserModel.find{}.populate'dictionaries'.exec

您可以在mongoose文档中找到示例

您可以将引用作为新字段存储在字典模型中,例如creator 创建者:{type:mongoose.Schema.ObjectId,ref:}

然后,您可以查询字典模型以按创建者查找

DictionaryModel.find{creator:ObjectId}


或者,如果您不想链接,您可以将字典直接作为数组字段存储在您的用户模型中

如果您不保留任何引用关系的内容,您如何告诉单词的所有者,或者某个特定用户拥有哪些单词?但是来自用户和字典模型的objectid都是不同的,一个是在注册期间创建的,另一个是在用户将数据提交到字典表时创建的。它如何知道与正确的用户对应?通过将ref放置到属性,它会正确链接吗?如果采用第一种方法,则必须在用户每次创建新词典时将dictionary ObjectId添加到创建它的用户的dictionary数组中。如果使用第二种方法,则每当创建新词典时,必须在词典的创建者字段中添加正在创建词典的用户的ObjectId。如何确保ID相同,因为这两个ObjectId都是使用唯一的ID创建的2个单独的表单-注册和添加词典数据?我可以为表单中的id手动创建一个自定义字段,但这将是用户需要填写的附加条目,不便于用户使用。