Определение отношения Mongoose к схеме существующей устаревшей схемы MongoDB

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

Я нахожусь в процессе переписывания производственного приложения Ruby на NodeJS; наша схема Ruby определила объект MongoDB, как показано в примере ниже.

У компании много пользователей, пользователь принадлежит многим компаниям

 // User
{
  "_id" : ObjectId("5b3a8344f7e49c50b882a4a3"),
  "name" : "Example User",
  "company_ids" : [ 
    ObjectId("5b3a8344f7e49c50b882a47e"), 
    ObjectId("5b3a8344f7e49c50b882a47f"), 
    ObjectId("5bdb97bff7e49c1e0a5964f3")
  ],
  "updated_at" : ISODate("2019-04-05T23:07:27.001Z"),
  "created_at" : ISODate("2018-07-02T19:55:49.422Z")
}

// Company
{
  "_id" : ObjectId("5b3a8344f7e49c50b882a47e"),
  "name" : "Example Company",
  "number" : 1, 
  "updated_at" : ISODate("2019-04-05T23:07:27.001Z"),
  "created_at" : ISODate("2018-07-02T19:55:49.422Z")
}
  

До сих пор я пытался определить свою связь между моделями следующим образом, но у меня ничего не получилось, я предполагаю, что mongoose пытается искать companyIds и не находит его в базе данных, но я понятия не имею, как вручную указать, какое поле отображать.

 // ./src/models/User.js
const mongoose = require('mongoose')

const UserSchema = new mongoose.Schema({
  name: String,
  companies: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Company', 
    companyIds: 'company_ids' // <- not working
  }]
}, {
  timestamps: {
    createdAt: 'created_at',
    updatedAt: 'updated_at'
  }
})
mongoose.model('User', UserSchema)
  

 // ./src/models/Company.js
const mongoose = require('mongoose')

const CompanySchema = new mongoose.Schema({
  name: String,
  number: Number
}, {
  timestamps: {
    createdAt: 'created_at',
    updatedAt: 'updated_at'
  }
})

mongoose.model('Company', CompanySchema)
  

Ответ №1:

Взглянув в документы Mongoose, ваш лучший вариант aliases , вы могли бы написать свою схему следующим образом:

 const mongoose = require('mongoose')

var companySchema = new mongoose.Schema({
  "name": String,
});
var Company = mongoose.model('Company', companySchema);

var compA = Company({ name: 'a'});
var compB = Company({ name: 'b'});
var compC = Company({ name: 'c'});

var userSchema = new mongoose.Schema({
  "company_ids": {
    type: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Company',
    }], 
    alias: 'companies'
  }
})
var User = mongoose.model('User', userSchema);
var user = new User({ companies: [compA, compB, compC]});
console.log(user)
console.log(user.companies);
  

Когда вы регистрируете объект, вы получаете { company_ids: [compA, compB, compC]} , но помимо этого, вы можете использовать поле «компании», например, это:

 var user = new User({ companies: [compA, compB, compC]});
console.log(user) // { company_ids: [compA, compB, compC] }
console.log(user.companies); // [compA, compB, compC]
user.companies = [compA, compB]
console.log(user.companies); // [compA, compB]
  

Комментарии:

1. это возвращает только идентификатор компании, но, к сожалению, не сам объект company