根据Meteor中的过滤器查询集合对象

时间:2015-07-03 16:00:23

标签: mongodb meteor

我在Jobs内有一个集合对象,如下所示:

{
  title: "foo",
  style: {
    env: 1,
    type: 0,
    location: -1,
  }
}

我也有像这样的会话过滤器

Session.set('filter', {env: 1});

我的问题是如何在集合中返回所有对象(假设有多个具有env: 1的对象),并将该过滤器作为style的一部分?

即:

var filter = Session.get('filter');
Jobs.find({style: filter}).fetch();

2 个答案:

答案 0 :(得分:1)

在您的示例中,您需要进行的查询看起来像Jobs.find({'style.env': 1}).fetch()。这是动态构建它的一种方法:

var base = 'style.';
var selector = {};

_.each(_.keys(filter), function(key) {
  return selector[base + key] = filter[key];
});

Jobs.find(selector).fetch();

答案 1 :(得分:0)

您需要使用 dot notation 来查询具有此类嵌入式文档结构的集合

Jobs.find({"style.env": 1}).fetch();

为了使用Session对象中的点符号构造查询对象,您可以首先使用本机JavaScript方法(如 {{3)的组合创建基于过滤器对象键的查询对象。 获取过滤器对象键, Object.keys() 设置点符号查询。以下演示了如何为任何嵌入对象创建点表示法查询:

// setting up the filter 
Session.set('filter', {env: 1});

// getting
var filter = Session.get('filter');
var keys = Object.keys(filter);
var root_key = "style."
var query = {};
keys.forEach(function(key){
    query[root_key + key] = filter[key];
});

Jobs.find(query).fetch(); 

查看下面的演示。



var filter = { /* simulating var filter = Session.get('filter'); */
    env: 1,
    type: 0,
    location: -1,
}; 
var keys = Object.keys(filter);
var query = {};
keys.forEach(function(key){
    query["style."+key] = filter[key];
});

pre.innerHTML = JSON.stringify(query, null, 4);

<pre id="pre"></pre>
&#13;
&#13;
&#13;