#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