首页 > 解决方案 > 如何将文档从一个集合复制到另一个集合?

问题描述

我使用以下模型:

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从数据库中找到一个并将其分配给createdByupdatedBy字段时,我得到重复键错误。下面是代码:

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

为什么我会收到此错误,我该如何解决?

标签: node.jsmongoose

解决方案


问题是我在集合中已经有另一个文档,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,
  }
);

推荐阅读