В чем разница между использованием метода `clone` и `Object.assign` для клонирования/расширения схемы в мангусте?

avatar
weichao.x
8 апреля 2018 в 04:56
134
1
1

Моя цель состоит в том, чтобы клонировать/расширить общую схему с помощью разных коллекций, есть два способа достижения моей цели, я хотел бы знать разницу между этими способами:

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 });
Источник

Ответы (1)

avatar
lineus
8 апреля 2018 в 09:33
0

Метод 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:

Вы можете проверить источник для schema.clone в node_modules/mongoose/lib/schema.js или источник mongoose.Schema на github.