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