Node.js mongoosejs对多个引用字段的查询
我正在将mongoosejs与nodejs和express一起使用,并且在多个引用字段上搜索时遇到了一个问题 我有三种模式,如下所示Node.js mongoosejs对多个引用字段的查询,node.js,mongodb,mongoose,datatables,mongoose-populate,Node.js,Mongodb,Mongoose,Datatables,Mongoose Populate,我正在将mongoosejs与nodejs和express一起使用,并且在多个引用字段上搜索时遇到了一个问题 我有三种模式,如下所示 var CompanySchema = mongoose.Schema({ name: {type: "String"}, category: {type:"String", ref: "CompanyCategory"}, _id: {type: "String"}, companyProfile: { logo: {
var CompanySchema = mongoose.Schema({
name: {type: "String"},
category: {type:"String", ref: "CompanyCategory"},
_id: {type: "String"},
companyProfile: {
logo: {type:"String"},
address: {type:"String"},
website: {type:"String"},
email: {type: "String"},
ceo: {type:"String"}
}
......
员工
var EmployeeSchema = mongoose.Schema({
name: { type: "String" },
company: {type: "String", required:true, ref: "Company"},
contact: {
address: {type: "String"},
phone: [],
website: {type: "String"}
}
.......
});
事件
var EventSchema = mongoose.Schema({
title: {type: String},
company: {type: "String", required:true, ref: "Company"},
contactPerson: {type: mongoose.Schema.Types.ObjectId, ref: "Employee"},
category: {type: "String", required:true},
date: {type: "Date"},
agenda: {type: "String"},
......
});
我正在使用JQuery数据库(),需要为事件列表页面实现一个输入搜索功能(例如:)。我花了很多时间寻找解决方案,但运气不佳。大多数答案指向“填充”上的查询条件,但我需要$或“填充”后的结果条件
类似于下面的内容,在没有引用的架构上工作:
if ( req.query.search.value ){
var searchValue = req.query.search.value;
query.$or = [
{ company.name: new RegExp(searchValue , 'i') },
{ contactPerson.name: new RegExp(searchValue, 'i') },
{ status: new RegExp(searchValue, 'i') },
{ venue: new RegExp(searchValue, 'i') },
{ agenda: new RegExp(searchValue, 'i') }
];
}
有什么好的、有效的解决方案吗?或者我需要改变模式吗?我想到了嵌入模式,但如果员工更改了其详细信息(如姓名),那么我需要更新所有嵌入模式中的更改,并且大多数集合中都引用了公司
company.name
和contactPerson.name
是填充后的结果。我尝试了populate().find(),populate().where()
,但似乎没有任何效果。任何帮助和指导都会有帮助。谢谢。恐怕你的尝试是不可能的。获得所需结果的最简单解决方案是执行三个查询。首先执行Company.find(名称:new RegExp(searchValue,'i'))…
如果没有任何结果,请执行Employee.find(名称:new RegExp(searchValue,'i'))…
如果仍然没有结果,请使用查询。$或不带Company.name和contactPerson.name的。另外,这可能会很有帮助@Molda感谢您的回复。如果我规范化数据,如果员工或公司档案发生更改,事件将具有旧数据。如果公司或员工档案发生变化,嵌入和同步是否有效。我不确定你的意思是,如果数据正常化,事件将包含旧数据。。。此外,由于company.name和contactPerson.name不太可能经常更改,因此将它们嵌入到事件中似乎是一个好主意。这将大大提高性能。@Molda谢谢,我已经更改了架构,并将引用保留为id,还将名称包含在事件中。恐怕您的尝试是不可能的。获得所需结果的最简单解决方案是执行三个查询。首先执行Company.find(名称:new RegExp(searchValue,'i'))…
如果没有任何结果,请执行Employee.find(名称:new RegExp(searchValue,'i'))…
如果仍然没有结果,请使用查询。$或不带Company.name和contactPerson.name的。另外,这可能会很有帮助@Molda感谢您的回复。如果我规范化数据,如果员工或公司档案发生更改,事件将具有旧数据。如果公司或员工档案发生变化,嵌入和同步是否有效。我不确定你的意思是,如果数据正常化,事件将包含旧数据。。。此外,由于company.name和contactPerson.name不太可能经常更改,因此将它们嵌入到事件中似乎是一个好主意。这将大大提高性能。@Molda谢谢,我已经更改了架构,并将引用保留为id,还将名称包含在事件中。