node.js - 如何将文档从一个集合复制到另一个集合?
问题描述
我使用以下模型:
const { model, Schema } = require('mongoose');
const userSchema = new Schema({
name: String,
email: { type: String, unique: true },
password: String,
});
const User = model('User', userSchema);
module.exports = { userSchema, User };
和
const { model, Schema } = require('mongoose');
const { userSchema } = require('./user');
const shopSchema = new Schema({
name: String,
address: String,
contact: { type: String, unique: true },
createdBy: userSchema,
updatedBy: userSchema,
});
const Shop = model('Shop', shopSchema);
module.exports = { shopSchema, Shop };
现在的问题是:当我user
从数据库中找到一个并将其分配给createdBy
和updatedBy
字段时,我得到重复键错误。下面是代码:
const { Shop } = require('./shop');
const { User } = require('./user');
const user = await User.findById(id);
const shop = new Shop({ createdBy: user, updatedBy: user });
以下是错误:
MongoError: E11000 duplicate key error collection: database.shops index: updatedBy.email dup key: { 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 = new Schema(
{
//...
},
{
excludeIndexes: true,
}
);
推荐阅读
- python - 在重新启动代码之前,模块对象不会更新
- docker - 升级 Rancher 的 Let's encrypt 以支持 ACMEv2
- react-native - 如何在反应原生渲染中更新标题?
- python - 在Python中用文件内的变量替换字符串
- amazon-web-services - 将弹性 IP 从一个 AWS 账户转移到另一个 AWS 账户?
- c# - 将 mongo db 数据加载到 .net 核心应用程序需要太多时间
- mongodb - MongoDB - 尽管有 atlasAdmin 角色,但未在共享集群中授权
- marklogic - cts:element-query vs cts:path-range-query 性能
- php - 如果你使用 exclude_if 并且它是 TRUE,Laravel 可以忽略进一步的验证规则吗?
- javascript - Ag-Grid:无法读取属性 0