2016-03-01 130 views
0

在我的收藏中,我得到了两个字段gendercountryMongoDB查询查找多个字段或文档

gender字段中,它们都是“女性”,并且它们每个都在不同的country

我试图查询集合:

return Meteor.users.find(
    { 
     _id: {$ne: Meteor.userId()}, 
     $or: [ { "country": "Australia" }, { "gender": "" } ] 
    }).fetch(); 

结果是这样的:

当设置gender为“空”或清空它给了我是谁在澳大利亚的所有用户。

但是,当我设置gender为“女”和country为“澳大利亚”它给了我所有的女性用户从被认为是澳大利亚唯一female不同的国家。它似乎忽略了country的第一个参数。

有没有办法让它更准确?请帮助谢谢你。

我的目标是:

为了更准确地进行数据库查询和BW能够通过这种变化。

例子:

回过头来看看这个问题上面,当我添加了“性别”的搜索查询时,它应该只找女性用户他的国家是澳大利亚。并非所有来自不同国家的女性。

+0

您可以通过编辑它来包含一些样本文件和预期的输出,因为目前很难遵循,请您澄清一下您的问题?如果所有文件的“性别”字段都是“女性”字段,但具有不同的“国家/地区”值,那么为什么不能在“国家/地区”字段上查询? – chridam

回答

0

我终于找到了解决这个问题的方法。这是一个很长的代码,但它的确有窍门。

  1. 我扫描我并取出空数据,在我的情况下,如果以上性别==为“”那么,如果存在忽略其他人获取其数据的数据。我通过循环做到了。

  2. 使用数组推送我能够插入对象。例如:如果国家不为空,那么:

    变量 .push('{“+ objectPropertyName [i] +''+':'+'”'+ objectValue [i] +'“}');

这样做的输出如下所示:

["{"country":"Australia"}", "{"gender":"female"}"] 

通过将其解析为JSON然后成为一个对象。

一旦所有所需查询的对象设置的,我可以通过查询蒙戈:

db.collection.find({"_id": {$ne: Meteor.userId()}, $and: **variable**}).fetch(); 

到目前为止,它完美的作品。 :)

3

由于需要满足两个条件的女性,以及国家,它应该是和

return Meteor.users.find({ _id: {$ne: Meteor.userId()}, 
          $and: [{"country": "Australia"}, 
            {"gender": "female"}] 
         }).fetch(); 
+0

一个很好的建议,我试过了,但是当设置性别或国家为空或没有值时,它不会显示任何结果。 我正在创建一个过滤器搜索功能,有时某些字段可能为空或没有值,这就是为什么我决定使用“OR”,因此它可以忽略空值并仅执行带有值的值。 –

+0

@WebsiteIsFun如果你真的“总是”想要“女性”的性别,那么它**是一个“AND”条件。这里唯一重新调整的是“所有”MongoDB查询条件已经是“AND”条件,所以'{“_id”:{“$ ne”:Meteor.userId(),“country”:“Australia”,“gender” :“女性”}'或者如果你真的不具体说明国家的价值,那就在那里使用'$或':'{“_id”:{“$ ne”:Meteor.userId(),“gender”:“female “,”$ or“:[{”country“:{”$ in“:[”Australia“,null]},{”country“:{”$ exists“:false}}]}'然而,数据被存储。 –

+0

@WebsiteIsFun Point是你描述的逻辑在你的问题中表示“AND”而不是“OR”。最多一个“OR”只适用于字段的多个可能值,被'$ in'(缩写为'$或'为一个值或'null')和$存在'测试应该覆盖该领域甚至不存在。 –

0

这可能不是完美的解决方案,但你可以做这样的事情:

var filter = { }; 

filter._id = { $ne: Meteor.userId() }; 

if(Meteor.country()){ 
    filter.country = Meteor.country(); 
}; 

if(Meteor.gender()){ 
    filter.gender = Meteor.gender(); 
}; 

return Meteor.users.find(filter).fetch(); 

而且,因为你不知道该查询是要执行什么样的基础上,你不应该使用运营商如$and$or

的查询文件,您为所有用户准备了查询,其中_id不等于Meteor.userId()ANDcountry =澳大利亚gender =女性。

另外,zangw建议的解决方案中,$和不是必需的,因为find方法的查询文档中的所有条件都是隐式“与”运算。

希望这会有所帮助。

+0

非常感谢。 。让我试着用你的解决方案做一些测试。 。 –