Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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 mongoosejs对多个引用字段的查询_Node.js_Mongodb_Mongoose_Datatables_Mongoose Populate - Fatal编程技术网

Node.js mongoosejs对多个引用字段的查询

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: {

我正在将mongoosejsnodejsexpress一起使用,并且在多个引用字段上搜索时遇到了一个问题

我有三种模式,如下所示

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,还将名称包含在事件中。