0

请让我想一想如何动态查询集合。我有一个具有以下架构的集合。

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语句来查询所有可能的字段组合,但我有点意识到这不是实现这一目标的方法。如果我能指出正确的方向,我将不胜感激。

4

2 回答 2

0

Let's take the simple case where your collection has several keys, the user can query on any combination of them, and you want to AND the results. A typical pattern would be:

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);

For simplicity, the above assumes that you've given each search field an ID equal to the corresponding schema field. Your naming convention may vary.

As you can see, you start with a blank query object then look at each search field, if it is non-blank then you add a key to the query corresponding to the schema key you want to search on.

With good naming conventions and a simple field structure you can even do this in a js loop so you don't need one if statement per key.

于 2016-09-07T23:23:37.103 回答
0

在不知道用户如何选择查询、集合名称等细节的情况下,很难提供详细的示例;但是,您应该能够获取用户的选择并将其转换为查询参数对象。例如,假设集合名称是 Tripart_Property,如果用户选择 sale_lease 字段,您可以执行以下操作:

var saleLeaseSelection = argumentContainingSelectionFromUser;
var customQuery = { sale_lease: saleLeaseSelection };
Tripart_Property.find(customQuery);

这是一个非常基本的例子。argumentContainingSelectionFromUser 是来自用户选择的数据。您可能希望在服务器上构建一个可以从客户端调用的方法,该方法将返回查询结果,以便您可以将它们显示给用户,但这至少应该让您指向正确的方向。

于 2016-09-07T14:59:19.343 回答