2012-06-17 91 views
0

我不知道如何做到这一点,所以我需要你的建议。我有4个复选框形式:NodeJS + MongoDB:查找()具体条件

<input type="checkbox" class="checkbox" id="check_stain"> 
<input type="checkbox" class="checkbox" id="check_black"> 
<input type="checkbox" class="checkbox" id="check_titan"> 
<input type="checkbox" class="checkbox" id="check_special"> 

我发送带有简单的数据提交,因此,如果check_stain被选中,然后req.body.check_stain会“上”,如果不是 - “不确定”。

在我的分贝我有收集“公司”,与几个对象,每个都包含这样的模式:

{... 
    "stain": "false", 
    "black": "true", 
    "titan": "false", 
    "special": "true", 
...} 

值是简单的字符串。所以,我需要获取指定复选框为真(on)的每个对象,但不包括nones(未定义)的对象。换句话说,我想创建一个简单的搜索算法。让我举个例子:我们检查check_stain,我们应该得到污点是“真实”的每个对象。也许其他值将是“真”/“假”(无所谓)。如果我们选择check_stain和check_black,我们得到污点& black =“true”的对象,其他字段不感兴趣。

我总是以这样代码中找到:

collection.find({ %my-condition% } ,function(err, companies) { 
    companies.each(function(err, company){ 
     //do smth with found 
    }); 
}); 

但我不知道怎么写条件去找寻。我想,我应该在请求中使用$或operator。我阅读了文档,但我仍然无法得到它。谢谢。

UPDATE:咦,这似乎是我的问题的解决方案:

if (req.body.sort_query == 'req-steel') { 
var condition = {} 
if (req.body.check_stain == "on") {condition['stain'] = 'true';} 
if (req.body.check_black == "on") {condition['black'] = 'true';} 
if (req.body.check_titan == "on") {condition['titan'] = 'true';} 
if (req.body.check_other == "on") {condition['special'] = 'true';} 
for (var i in condition) { 
    if (condition[i] != "true") { 
     delete condition[i]; 
    } 
} 
var companies_list = new Array(); 
collection.find(condition, function (err, companies) { 
    companies.each(function (err, company) { 
     //do smth 
    }); 
}); 
}; 
+0

在哪里的问题?只需使用真实的键创建对象并将其他对象留出。 – noob

+0

不知道我对你的理解是否正确。我应该在哪里创建一个新的对象,数据库与collection.insert()或在哪里?就我所知,你建议发送这个对象作为查找请求的参数或什么? – f1nn

+0

'stain'应该是'“true”':'collection.find({stain:“true”})''stain'&'black'应该是'“true”':'collection.find({stain:“ true“,black:”true“})' – noob

回答

1

例如黑色和染色为真:

var condition = { 
    "stain": "false", 
    "black": "true", 
    "titan": "false", 
    "special": "true", 
} 

for (var i in condition) { 
    if (condition[i] != "true") { 
     delete condition[i]; 
    } 
} 

collection.find(condition ,function(err, companies) { 
    companies.each(function(err, company){ 
     //do smth with found 
    }); 
}); 

Live condition DEMO

+0

谢谢你,给我一点时间来检查你的代码。我仍然不能得到它是如何工作的... – f1nn

+0

只需从条件对象中删除所有不是真的键。 – noob

+0

我已更新我的帖子。这是我写的代码。我已经越过了我的手指并启动了它:)呵呵,它似乎正在正常工作:)非常感谢! – f1nn