如何构建动态MongoDb查询

时间:2016-09-07 14:35:55

标签: mongodb meteor dynamic-queries

请问我是否想要动态地查询集合。我有一个具有以下架构的集合。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

让我们假设您的集合有多个键,用户可以查询它们的任意组合,并且您想要结果的简单情况。典型的模式是:

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语句。