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