Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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 如何将文档从一个集合复制到另一个集合?_Node.js_Mongoose - Fatal编程技术网

Node.js 如何将文档从一个集合复制到另一个集合?

Node.js 如何将文档从一个集合复制到另一个集合?,node.js,mongoose,Node.js,Mongoose,我使用以下型号: const{model,Schema}=require('mongoose'); const userSchema=新模式({ 名称:String, 电子邮件:{type:String,unique:true}, 密码:String, }); const User=model('User',userSchema); module.exports={userSchema,User}; 及 const{model,Schema}=require('mongoose'); cons

我使用以下型号:

const{model,Schema}=require('mongoose');
const userSchema=新模式({
名称:String,
电子邮件:{type:String,unique:true},
密码:String,
});
const User=model('User',userSchema);
module.exports={userSchema,User};

const{model,Schema}=require('mongoose');
const{userSchema}=require('./user');
const shopSchema=新模式({
名称:String,
地址:String,
联系人:{type:String,unique:true},
createdBy:userSchema,
更新人:userSchema,
});
const Shop=model('Shop',shopSchema);
module.exports={shopSchema,Shop};
现在的问题是:当我从数据库中找到一个
用户
并将其分配到
createdBy
updatedBy
字段时,我得到了重复的键错误。代码如下:

const{Shop}=require('./Shop');
const{User}=require('./User');
const user=wait user.findById(id);
const shop=new shop({createdBy:user,updatedBy:user});
下面是错误:

MongoError:E11000重复密钥错误集合:database.shops索引:updatedBy.email dup密钥:{updatedBy.email:foo@bar.baz" }

为什么会出现此错误以及如何修复此错误?

问题是,我的集合中已有另一个文档,其中
createdAt.email
updatedAt.email
与我要插入的文档相匹配。例如:

_id: ObjectId("...")
name: "..."
address: "..."
contact: "..."
createdBy: Object
    _id: ObjectId("...")
    email: "foo@bar.baz"
updatedBy: Object
    _id: ObjectId("...")
    email: "foo@bar.baz"
已经存在,我尝试添加另一个文档,这些字段的值相等

但这不应该是一个问题,因为我没有将该文档分配给它的父文档,而是将其作为子文档分配到不同的集合中。所以它不应该担心重复密钥的问题。现在我需要知道是否有办法告诉MongoDB/Mongoose不要担心这个问题

修正: Mongoose实际上支持嵌套子文档的索引排除。详情请参阅。您所要做的就是将第二个参数传递给
Schema
构造函数,这是一个指定不为子路径编制索引的对象。像这样:

const shopSchema=新模式(
{
//...
},
{
excludeIndexes:true,
}
);

您这样定义电子邮件

 email: { type: String, unique: true }
当一个字段是唯一的时,mongoose索引它,当一个字段是索引时,集合中应该只有一个数字,所以

第一种方法:您应该在删除集合后从电子邮件中删除
unique:true
,以完全删除索引,或者使用命令删除索引

第二种方法:将使用模型放在一个字段中,在
createdBy
updatedBy
中,
当您将用户放在一个集合的两个字段中时,创建了重复密钥

不,不是这样。我已经编辑了我的答案,请检查。答案很好,谢谢你,向上投票