填充嵌套数组的 none 个 ref 对象
Populate none ref objects of a nested array
我正在开发一个使用以下项目的项目:
"@nestjs/core": "^7.0.0",
"@nestjs/mongoose": "^7.0.0",
"mongoose": "^5.9.12",
// ...
"typescript": "^3.7.4",
使用 mongoose/mongoDB 配置:
uri: MONGO_DB_URI,
useUnifiedTopology: true,
useNewUrlParser: true,
useFindAndModify: false,
useCreateIndex: true,
我正在尝试为此模型构建一个简单的 CRUD:
export const ContactSchema = new mongoose.Schema(
{
source_id: { type: String, required: true },
firstName: { type: String, trim: true },
lastName: { type: String, trim: true },
phones: [
{
number: {
type: String,
required: true,
unique: true,
validate: {
validator: function(value) {
const phoneNumber = parsePhoneNumberFromString(value)
return phoneNumber && phoneNumber.isValid()
},
},
},
type: {
type: String,
default: function() {
return parsePhoneNumberFromString(this.number).getType() || "N/A"
},
},
code: {
type: Number,
default: function() {
return parsePhoneNumberFromString(this.number).countryCallingCode || undefined
},
},
national: {
type: Number,
default: function() {
return parsePhoneNumberFromString(this.number).nationalNumber || undefined
},
},
},
],
email: { type: String, unique: true, required: true, lowercase: true, trim: true },
},
{ timestamps: true },
)
ContactSchema.plugin(mongoosePaginate)
像每个 CRUD 应用程序一样,我愿意 fildAll()
和 fildOne()
路由 return 给定 Contact
的主体 他的所有信息,包括 phone 个号码 的列表。所以我用了:
// ...
async findAll(): Promise<Contact[]> {
return this.contactModel.find()
// then I add
.populate('phones')
}
async findBySourceId(id: string): Promise<Contact> {
return this.contactModel.findOne({ source_id: id })
// then I add
.populate('phones')
}
// ...
所有信息都很好地保存在数据库中,并且没有丢失数据(phones),我确信它在一开始就可以工作,甚至没有添加 .poplate('x')
,但情况发生了变化某处 它 return 现在无人居住 phone 数组 .
现在 returns:
{
"_id": "5ebc22072e18637d84bcf6f0",
"firstName": "Maher",
"lastName": "Boubakri",
"phones": [],
"email": "mhb@test.im",
// ...
}
但是,它应该 return:
{
"_id": "5ebc22072e18637d84bcf6f0",
"firstName": "Maher",
"lastName": "Boubakri",
"phones": [
{
"_id": "5ebc22072e18637d8fd948f9",
"number": "+21622123456",
"code": 216,
"type": "MOBILE",
"national": 22123456,
}
],
"email": "mhb@test.im",
// ...
}
注意:很明显,MongoDB 为每个 phone 对象生成 _id
,但是,它不是 ref 对象。
任何想法都会很有帮助,
谢谢。
populate 用于使用引用连接两个(或更多)集合
这里没有任何参考资料,所以不需要
只使用 find()
不用 populate
根据@Mohammed 的评论和回答,更新 mongoose
后添加 .lean()
解决了问题。
// ...
async findAll(): Promise<Contact[]> {
return this.contactModel.find().lean()
}
async findBySourceId(id: string): Promise<Contact> {
return this.contactModel.findOne({ source_id: id }).lean()
}
// ...
我正在开发一个使用以下项目的项目:
"@nestjs/core": "^7.0.0",
"@nestjs/mongoose": "^7.0.0",
"mongoose": "^5.9.12",
// ...
"typescript": "^3.7.4",
使用 mongoose/mongoDB 配置:
uri: MONGO_DB_URI,
useUnifiedTopology: true,
useNewUrlParser: true,
useFindAndModify: false,
useCreateIndex: true,
我正在尝试为此模型构建一个简单的 CRUD:
export const ContactSchema = new mongoose.Schema(
{
source_id: { type: String, required: true },
firstName: { type: String, trim: true },
lastName: { type: String, trim: true },
phones: [
{
number: {
type: String,
required: true,
unique: true,
validate: {
validator: function(value) {
const phoneNumber = parsePhoneNumberFromString(value)
return phoneNumber && phoneNumber.isValid()
},
},
},
type: {
type: String,
default: function() {
return parsePhoneNumberFromString(this.number).getType() || "N/A"
},
},
code: {
type: Number,
default: function() {
return parsePhoneNumberFromString(this.number).countryCallingCode || undefined
},
},
national: {
type: Number,
default: function() {
return parsePhoneNumberFromString(this.number).nationalNumber || undefined
},
},
},
],
email: { type: String, unique: true, required: true, lowercase: true, trim: true },
},
{ timestamps: true },
)
ContactSchema.plugin(mongoosePaginate)
像每个 CRUD 应用程序一样,我愿意 fildAll()
和 fildOne()
路由 return 给定 Contact
的主体 他的所有信息,包括 phone 个号码 的列表。所以我用了:
// ...
async findAll(): Promise<Contact[]> {
return this.contactModel.find()
// then I add
.populate('phones')
}
async findBySourceId(id: string): Promise<Contact> {
return this.contactModel.findOne({ source_id: id })
// then I add
.populate('phones')
}
// ...
所有信息都很好地保存在数据库中,并且没有丢失数据(phones),我确信它在一开始就可以工作,甚至没有添加 .poplate('x')
,但情况发生了变化某处 它 return 现在无人居住 phone 数组 .
现在 returns:
{
"_id": "5ebc22072e18637d84bcf6f0",
"firstName": "Maher",
"lastName": "Boubakri",
"phones": [],
"email": "mhb@test.im",
// ...
}
但是,它应该 return:
{
"_id": "5ebc22072e18637d84bcf6f0",
"firstName": "Maher",
"lastName": "Boubakri",
"phones": [
{
"_id": "5ebc22072e18637d8fd948f9",
"number": "+21622123456",
"code": 216,
"type": "MOBILE",
"national": 22123456,
}
],
"email": "mhb@test.im",
// ...
}
注意:很明显,MongoDB 为每个 phone 对象生成 _id
,但是,它不是 ref 对象。
任何想法都会很有帮助,
谢谢。
populate 用于使用引用连接两个(或更多)集合
这里没有任何参考资料,所以不需要
只使用 find()
不用 populate
根据@Mohammed 的评论和回答,更新 mongoose
后添加 .lean()
解决了问题。
// ...
async findAll(): Promise<Contact[]> {
return this.contactModel.find().lean()
}
async findBySourceId(id: string): Promise<Contact> {
return this.contactModel.findOne({ source_id: id }).lean()
}
// ...