Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Javascript 如何在mongo选择器中使用过滤器的默认值?_Javascript_Mongodb_Meteor_Selector - Fatal编程技术网

Javascript 如何在mongo选择器中使用过滤器的默认值?

Javascript 如何在mongo选择器中使用过滤器的默认值?,javascript,mongodb,meteor,selector,Javascript,Mongodb,Meteor,Selector,我正在尝试将筛选器应用于mongo find查询。其思想是,如果筛选器具有值,mongo选择器将限制返回的内容,但如果未指定筛选器(筛选器具有null或默认值),则不应限制查询。如果指定了过滤器,我知道如何让过滤器工作,但我不确定如果没有指定过滤器,如何确保它返回未过滤。如果未指定过滤器或过滤器的默认值,如何让find查询返回集合中的所有文档 仅供参考:我正在一个Meteor项目中使用它,并将过滤器作为一个会话变量,以使返回的内容动态 示例集合: /* example documents in

我正在尝试将筛选器应用于mongo find查询。其思想是,如果筛选器具有值,mongo选择器将限制返回的内容,但如果未指定筛选器(筛选器具有null或默认值),则不应限制查询。如果指定了过滤器,我知道如何让过滤器工作,但我不确定如果没有指定过滤器,如何确保它返回未过滤。如果未指定过滤器或过滤器的默认值,如何让find查询返回集合中的所有文档

仅供参考:我正在一个Meteor项目中使用它,并将过滤器作为一个会话变量,以使返回的内容动态

示例集合:

/* example documents in SampleCollection

{ name: "sample1", fieldA: "foo", fieldB: "foo" }
{ name: "sample2", fieldA: "foo", fieldB: "bar" }
{ name: "sample3", fieldA: "bar", fieldB: "foo" }
{ name: "sample4", fieldA: "bar", fieldB: "bar" }

*/
示例JS代码:

var filters = {
    fieldA: null,
    fieldB: null
};

var getFieldASelector = function () {
    if (filters.fieldA) {
        return { $eq: fieldA };
    } else {
        /* fieldA has a falsey value which is the default
            and therefore should not limit the find query */
        // not sure what to return here
        return {};
    };
};

var getFieldBSelector = function () {
    if (filters.fieldB) {
        return { $eq: fieldB };
    } else {
        /* fieldB has a falsey value which is the default
            and therefore should not limit the find query */
        // not sure what to return here
        return {};
    };
};

var results = SampleCollection.find({
    fieldA: getFieldASelector(),
    fieldB: getFieldBSelector()
});

在本例中,
结果
应返回所有四个文档。如果
filter={fieldA:“foo”,fieldB:null}
然后
结果
应该返回文档sample1和sample2。

我建议您创建一个
选择器
对象,并根据给定的过滤器填充它。虽然我不确定这是否是你想要的

function getResults(filter){
    var selector = {};

    // what this does is filters aways keys with non-truthy values
    Object.keys(filter).reduce(function (prev, curr){
        var val = filter[curr];
        if (!!val)
          prev[curr] = filter[curr];
        return prev;
    }, selector);

    return SampleCollection.find(selector);
}

当您实际想要过滤具有非真实值(如
0
或空字符串)的字段时,您会发现哪些意外行为。

假设每个文档都有两个键,您可以
返回{$ne:null}
。如果要在键存在但其值为null时使If有效,还可以
返回{$exists:true}

这可能有效,我将使用Meteor的会话变量测试它,以查看它在动态更改filters对象时是否有效。我所寻找的是在SampleCollection.find({fieldA:{})中提供一个比较(例如:{$eq:{foo}),它返回所有文档,而不管fieldA是什么。这样,当filter.fieldA为truthy时,它将实际限制查询。这有意义吗?我想你可以改变
prev[curr]=filter[curr]
to
prev[curr]={$eq:filter[curr]}