如何构造动态 MongoDb 查询
How To Structure Dynamic MongoDb Query
拜托,我正在努力思考如何动态查询集合。我有一个具有以下架构的集合。
Tripart_Property_Schema = new SimpleSchema({
"type" : {
type : String,
label : 'Property type',
},
"sale_lease" : {
type : String,
label : '',
},
"location" : {
type : Object,
label : '',
optional : true
},
"location.state" : {
type : String,
label : 'state',
},
"location.lga" : {
type : String,
label : 'lga',
optional : true
},
"location.address" : {
type : String,
label : 'address',
optional : true
},
"amount" : {
type : Object,
label : '',
optional : true
},
"amount.amount" : {
type : Number,
label : '',
optional : true
},
"amount.discount" : {
type : Number,
label : '',
optional : true
},
"active" : {
type : Boolean,
label : '',
optional : true
},
"views" : {
type : Number,
label : '',
optional : true
},
"date_added" : {
type : Date ,
label : '',
optional : true
},
"general_features" : {
type : [String],
label : '',
optional : true
},
"outdoor_features" : {
type : [String],
label : '',
optional : true
},
"indoor_features" : {
type : [String],
label : '',
optional : true
},
"other_facilities" : {
type : Object,
label : '',
optional : true
},
"other_facilities.bedroom" : {
type : Number,
label : '',
optional : true
},
"other_facilities.bathroom" : {
type : Number,
label : ' ',
optional : true
},
"other_facilities.garage" : {
type : Number,
label : '',
optional : true
},
"other_facilities.staffQuaters" : {
type : Number,
label : '',
optional : true
}
});
我创建了一个用户界面,用户可以在其中使用可用字段的任意组合来查询数据。用户可以通过使用 sale_lease
字段、amount.amount
字段来查询搜索 属性,还可以查询作为数组的 general_features
字段。我不知道如何根据用户选择的首选项生成此查询。我知道如何在知道事先查询的字段的情况下执行查询,但问题在于使其动态化。
我正在尝试使用多个 if
语句来查询所有可能的字段组合,但我意识到这不是实现此目的的方法。如果能指出正确的方向,我将不胜感激。
在不了解用户如何为查询进行选择、集合名称等细节的情况下,很难提供详细的示例;但是,您应该能够获取用户的选择并将其转换为查询参数对象。例如,假设集合名称是 Tripart_Property,如果用户选择 sale_lease 字段,您可以执行以下操作:
var saleLeaseSelection = argumentContainingSelectionFromUser;
var customQuery = { sale_lease: saleLeaseSelection };
Tripart_Property.find(customQuery);
这是一个非常基本的例子。 argumentContainingSelectionFromUser 是来自用户选择的数据。您可能希望在服务器上构建一个方法,您可以从客户端调用该方法 return 查询结果,以便您可以将它们显示给用户,但这至少应该让您指出正确的方向。
让我们举一个简单的例子,您的集合有多个键,用户可以查询它们的任意组合,而您想要 AND 结果。一个典型的模式是:
let query = {}'
if ( $("#type").length ) query.type = $("#type").val();
if ( $("#sale_lease").length ) query.sale_lease = $("#sale_lease").val();
if ( $("#state").length ) query.location = { state: $("#state").val() };
return Tripart_Property.find(query);
为简单起见,以上假定您已为每个搜索字段指定了一个与相应架构字段相同的 ID。您的命名约定可能会有所不同。
如您所见,您从一个空白的查询对象开始,然后查看每个搜索字段,如果它是非空白的,那么您将一个键添加到与您要搜索的架构键相对应的查询中。
通过良好的命名约定和简单的字段结构,您甚至可以在 js 循环中执行此操作,因此您不需要每个键一个 if
语句。
拜托,我正在努力思考如何动态查询集合。我有一个具有以下架构的集合。
Tripart_Property_Schema = new SimpleSchema({
"type" : {
type : String,
label : 'Property type',
},
"sale_lease" : {
type : String,
label : '',
},
"location" : {
type : Object,
label : '',
optional : true
},
"location.state" : {
type : String,
label : 'state',
},
"location.lga" : {
type : String,
label : 'lga',
optional : true
},
"location.address" : {
type : String,
label : 'address',
optional : true
},
"amount" : {
type : Object,
label : '',
optional : true
},
"amount.amount" : {
type : Number,
label : '',
optional : true
},
"amount.discount" : {
type : Number,
label : '',
optional : true
},
"active" : {
type : Boolean,
label : '',
optional : true
},
"views" : {
type : Number,
label : '',
optional : true
},
"date_added" : {
type : Date ,
label : '',
optional : true
},
"general_features" : {
type : [String],
label : '',
optional : true
},
"outdoor_features" : {
type : [String],
label : '',
optional : true
},
"indoor_features" : {
type : [String],
label : '',
optional : true
},
"other_facilities" : {
type : Object,
label : '',
optional : true
},
"other_facilities.bedroom" : {
type : Number,
label : '',
optional : true
},
"other_facilities.bathroom" : {
type : Number,
label : ' ',
optional : true
},
"other_facilities.garage" : {
type : Number,
label : '',
optional : true
},
"other_facilities.staffQuaters" : {
type : Number,
label : '',
optional : true
}
});
我创建了一个用户界面,用户可以在其中使用可用字段的任意组合来查询数据。用户可以通过使用 sale_lease
字段、amount.amount
字段来查询搜索 属性,还可以查询作为数组的 general_features
字段。我不知道如何根据用户选择的首选项生成此查询。我知道如何在知道事先查询的字段的情况下执行查询,但问题在于使其动态化。
我正在尝试使用多个 if
语句来查询所有可能的字段组合,但我意识到这不是实现此目的的方法。如果能指出正确的方向,我将不胜感激。
在不了解用户如何为查询进行选择、集合名称等细节的情况下,很难提供详细的示例;但是,您应该能够获取用户的选择并将其转换为查询参数对象。例如,假设集合名称是 Tripart_Property,如果用户选择 sale_lease 字段,您可以执行以下操作:
var saleLeaseSelection = argumentContainingSelectionFromUser;
var customQuery = { sale_lease: saleLeaseSelection };
Tripart_Property.find(customQuery);
这是一个非常基本的例子。 argumentContainingSelectionFromUser 是来自用户选择的数据。您可能希望在服务器上构建一个方法,您可以从客户端调用该方法 return 查询结果,以便您可以将它们显示给用户,但这至少应该让您指出正确的方向。
让我们举一个简单的例子,您的集合有多个键,用户可以查询它们的任意组合,而您想要 AND 结果。一个典型的模式是:
let query = {}'
if ( $("#type").length ) query.type = $("#type").val();
if ( $("#sale_lease").length ) query.sale_lease = $("#sale_lease").val();
if ( $("#state").length ) query.location = { state: $("#state").val() };
return Tripart_Property.find(query);
为简单起见,以上假定您已为每个搜索字段指定了一个与相应架构字段相同的 ID。您的命名约定可能会有所不同。
如您所见,您从一个空白的查询对象开始,然后查看每个搜索字段,如果它是非空白的,那么您将一个键添加到与您要搜索的架构键相对应的查询中。
通过良好的命名约定和简单的字段结构,您甚至可以在 js 循环中执行此操作,因此您不需要每个键一个 if
语句。