我在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();
答案 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;