node.js - 使用 `clone` 和 `Object.assign` 方法在 Mongoose 中克隆/扩展模式有什么区别?

标签 node.js mongodb mongoose

我的目的是克隆/扩展具有不同集合的通用模式,有两种方法可以实现我的目的,我想知道这些方法之间的区别:

const extendSchema = (Schema, definition, options) =>
  new MongooseSchema(Object.assign({}, Schema.obj, definition), options);

const CommonSchema = new MongooseSchema({
  name: {
    type: String,
    unique: true,
  },
  logo: String,
  owner: {
    name: String,
    avatar: String,
    reference: {
      type: ObjectId,
      ref: 'User',
    },
  },
});

const AnthorSchema = extendSchema(CommonSchema, { periverImage: String });

第二个是:

const CommonSchema = new MongooseSchema({
  name: {
    type: String,
    unique: true,
  },
  logo: String,
  owner: {
    name: String,
    avatar: String,
    reference: {
      type: ObjectId,
      ref: 'User',
    },
  },
});

const AnthorSchema = CommonSchema.clone();
AnthorSchema.add({ previewImage: String });

最佳答案

模式上的clone方法不仅仅复制模式的obj属性,它还克隆静态、虚拟、实例方法等。

一个简单的例子:

#!/usr/bin/env node
'use strict'

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test')
const Schema = mongoose.Schema

const original = new Schema({
  name: String
})

original.statics.findAThing = function (n) {
  return this.find({ name: n }).exec()
}

const dupe = Object.assign({}, original.obj, { age: Number })

const clone = original.clone()

const Dupe = mongoose.model('dupe', dupe)
const Clone = mongoose.model('clone', clone)

const boo = new Dupe({
  name: 'casper',
  age: 93
})

const jango = new Clone({
  name: 'fett'
})

async function run () {
  await Dupe.remove({})
  await Clone.remove({})
  await boo.save()
  await jango.save()
  let doc = await Clone.findAThing('fett')
  console.log(doc)
  let fail = await Dupe.findAThing('casper')
  console.log(fail)
  return mongoose.connection.close()
}

run().catch(console.error)

输出:

stack: ./49714558.js
[ { _id: 5ac9e0f3d1d7d65547d3fdd1, name: 'fett', __v: 0 } ]
TypeError: Dupe.findAThing is not a function
    at run (/Users/lineus/dev/Help/mongoose5/stack/49714558.js:39:25)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
^C
stack:

您可以在 node_modules/mongoose/lib/schema.jsmongoose.Schema source on github 中查看 schema.clone 的源代码.

关于node.js - 使用 `clone` 和 `Object.assign` 方法在 Mongoose 中克隆/扩展模式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714558/

相关文章:

node.js - os.platform() 返回 darwin 而不是 OSX

javascript - Node.js 中的异步函数

mongodb - 在查找中比较字符串和 objectId

node.js - 具有动态引用的 Mongoose 事件模型

javascript - 合并 Mongoose 中的两个对象

node.js - req.user 是否传递给客户端?

node.js - 如何在我的 nodejs 应用程序中使用 cassandra 进行测试?

MongoDB聚合框架按数组长度排序

node.js - MongoNetworkError : failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127. 0.0.1:27017]

mongoose - Mongoose 嵌入式文档 ID 是否应该在父文档中是唯一的?