简体   繁体   中英

Mongoose: Recursive embedded-document in Coffeescript

Based on this example (which works):

var Comment = new Schema();

Comment.add({
    title : { type: String, index: true }
  , date : Date
  , body : String
  , comments : [Comment]
});

I wanted to create a CoffeeScript version

mongoose = require 'mongoose'
Schema = mongoose.Schema

Person = new Schema
Person.add
  mother: Person
  father: Person

However it returns an error and I don't understand why

TypeError: undefined is not a function
    at CALL_NON_FUNCTION_AS_CONSTRUCTOR (native)
    at Function.interpretAsType (/path/node_modules/mongoose/lib/schema.js:202:10)
    at Schema.path (/path/node_modules/mongoose/lib/schema.js:162:29)
    at Schema.add (/path/node_modules/mongoose/lib/schema.js:110:12)
    at Object.<anonymous> (/path/Models/test.coffee:6:10)
    at Object.<anonymous> (/path/Models/test.coffee:10:4)
    at Module._compile (module.js:411:26)
    at Object.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script.js:57:25)
    at /usr/local/lib/node_modules/coffee-script/lib/command.js:147:29
    at /usr/local/lib/node_modules/coffee-script/lib/command.js:115:26

EDIT: Okay, I found out that it doesn't work when Person isn't an array (in brackets), but why?

Embedded documents can only exist as items in an array. That is by design, you can ask the authors for their reasons :)

You might want to use a DBRef :

Person = new Schema
  mother: { type: Schema.ObjectId, ref: 'Person' }
  father: { type: Schema.ObjectId, ref: 'Person' }

(notice you don't need the add call)

See the docs for populate/DBRef .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM