Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何引用没有';我还没注册呢_Node.js_Mongodb_Mongoose_Mean - Fatal编程技术网

Node.js 如何引用没有';我还没注册呢

Node.js 如何引用没有';我还没注册呢,node.js,mongodb,mongoose,mean,Node.js,Mongodb,Mongoose,Mean,这个问题类似于: 使用猫鼬,我有如下代码。(我用数字作为文件的前缀,因此我可以按照它们在“models”目录中出现的顺序加载它们,但仍然可以控制加载顺序。) 在100-employee.server.model.js中: var mongoose = require('mongoose'), Schema = mongoose.Schema; var EmployeeSchema = new Schema({ name: { type: String, default:

这个问题类似于:

使用猫鼬,我有如下代码。(我用数字作为文件的前缀,因此我可以按照它们在“models”目录中出现的顺序加载它们,但仍然可以控制加载顺序。)

在100-employee.server.model.js中:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;

var EmployeeSchema = new Schema({
  name: {
    type: String,
    default: ''
  },
  company: {
    type: Schema.ObjectId,
    ref: 'Company'
  },
  subordinates: [EmployeeSchema],
});
mongoose.model('Employee', EmplyeeSchema);
然后,在200-company-server.js中,我有:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;

var CompanySchema = new Schema({
  name: {
    type: String,
    default: ''
  },
  CEO: {
    type: Schema.ObjectId,
    ref: 'Employee'
  }
});
mongoose.model('Company', CompanySchema);
显然,这是行不通的,因为公司在注册之前就被引用了。而且,由于同样的原因,以相反的顺序加载这些文件是行不通的。我需要的是逻辑数据结构,如:

{
  name: 'Acme, Inc',
  CEO: {
    name: 'Karen',
    subordinates: [{
      name: 'Bob',
      subordinates: [{
        name: 'Lisa',
        subordinates: []
      },
        name: 'Jerry',
        subordinates: []
      }]
    }]
  }   
}
(我想我已经准备好了所有的括号。我只是键入了JSON来说明需要。)

我可以在EmployeeSchema中使用“company”的ObjectId,但它不能解决这个问题。我仍然接到一个投诉,说这家公司还没有注册

有人会询问用例,所以这里是:

我有很多公司,我有一个公司的员工等级制度。而且,我有很多公司。对于每一家公司,我都需要了解CEO,而不必搜索我所有的员工,寻找一家没有母公司的公司,这家公司有ObjectId ref公司,但仍然会遇到同样的问题


有什么建议吗?

好的,我已经想出了一个答案,或者至少是一个解决办法。感觉不太优雅。事实上,我非常不喜欢它,但它确实有效。希望看到更好的解决方案。在100-company-server.js中,首先定义父实体,如下所示:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;

var CompanySchema = new Schema({
  name: {
    type: String,
    default: ''
  },
  CEO: {
    name: {   // This is the company name, so probably a bad example
      type: String,
      default: ''
    }, {
       shoeSize: Number
    }, etc ...
  }
});
mongoose.model('Company', CompanySchema);
这里需要注意的关键是,我没有将CEO设置为ObjectId ref'Employee',而是提供了一个与我的Employee模式使用相同属性的对象。根据您希望如何使用它,您可能必须将其强制为控制器中的Employee对象。或者,可能有一种聪明的方法可以使用虚拟机来做同样的事情(),但是,虚拟机只需要在EmployeeSchema和model之后定义

在200-employee.server.js中,类似于以下内容:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema,
  CompanySchema = mongoose.model('Company').schema;  // so you can use this 
                                                     // after your Employee 
                                                     // is defined

var EmployeeSchema = new Schema({
  name: {
    type: String,
    default: ''
  },
  company: {
    type: Schema.ObjectId,
    ref: 'Company'
  },
  subordinates: [],  // Just an empty array. You fill it with Employees in the controller. You could use a virtual to do the same thing, probably.
});

mongoose.model('Employee', EmployeeSchema);
所以,这有点难看,但它是有效的

要点:

  • 在定义CompanySchema时,不使用ObjectId ref“Employee”
  • 而是定义一个看起来像公司对象的对象
  • 因为这个对象没有_id,所以必须在 控制器。就我而言,这很好用。但是,对于许多/大多数用例来说 可能不会。你必须用聪明的虚拟人来解决这个问题 和/或控制器
  • 使用一个不带类型的简单数组来存储子对象(子对象) 这个例子。 该数组工作正常,返回对象就像使用数组一样 ObjectId ref雇员的
  • 让公司引用一名员工(尚未定义),您 必须将泛型对象转换为Employee对象 有很多方法可以做到这一点
  • 毫无疑问,有一种更好的方法可以做到这一点