MongoDB查询正确查找多个字段或文档

时间:2016-03-01 08:34:57

标签: mongodb

在我的收藏中,我有两个字段gendercountry

gender字段中,他们都是"女性"并且每个人都处于不同的country

我试图查询集合:

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

结果如下:

gender设置为" null"或清空它给了我在澳大利亚的所有用户。

但是当我将gender设置为"女性"和country到"澳大利亚"它给了我来自不同国家的所有女性用户,这些用户应该只是female来自澳大利亚。它似乎忽略了第一个参数,即country

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

我的目标是:

使数据库查询更准确,并且能够采用更改。

示例:

回到上面的问题,当我添加"性别"在搜索查询中,它应该只查找其国家/地区是澳大利亚的女性用户。不是所有来自不同国家的女性。

3 个答案:

答案 0 :(得分:3)

既然您需要满足女性和国家的条件,那么它应该是

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

答案 1 :(得分: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() AND country =澳大利亚或< / strong> gender =女性。

同样是zangw建议的解决方案,有$且不需要,因为find方法的查询文档中的所有条件都是隐式AND。

希望这有帮助。

答案 2 :(得分:0)

我终于找到了一个如何解决这个问题的解决方案。这是一个有点长的代码,但它做了伎俩。

  1. 我扫描了我得到的数据并删除了空数据,在上面的例子中,如果性别是==到“”然后忽略它,否则获取其数据(如果存在)。我是通过循环完成的。

  2. 使用数组推送我能够插入对象。例如:如果country不为null,则:

    <强>可变 .push( '{ “+ objectPropertyName [I] +”' + ':' + ' “ '+ objectValue [I] +'”}');

    < / LI>

    输出如下:

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

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

    一旦设置了查询所需的所有对象,我就可以通过以下方式查询mongo:

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

    到目前为止它完美无缺。 :)