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

MongoDB查询正确查找多个字段或文档,mongodb,Mongodb,在我的收藏中,我得到了两个字段,gender和country 在性别字段中,他们都是“女性”,并且每个人都在不同的国家 我试图查询集合: return Meteor.users.find( { _id: {$ne: Meteor.userId()}, $or: [ { "country": "Australia" }, { "gender": "" } ] }).fetch(); 结果如下: var filter = { }; filter.

在我的收藏中,我得到了两个字段,
gender
country

性别
字段中,他们都是“女性”,并且每个人都在不同的
国家

我试图查询集合:

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

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();
["{"country":"Australia"}", "{"gender":"female"}"]
当将
gender
设置为“null”或空时,它会显示所有在澳大利亚的用户

但是,当我将
gender
设置为“女性”并将
country
设置为“澳大利亚”时,它会显示来自不同国家的所有女性用户,而这些用户应该是来自澳大利亚的
女性。它似乎忽略了第一个参数,即
国家

有没有更准确的方法?请帮忙,谢谢

我的目标是:

使数据库查询更准确,bw能够适应更改

例如:


回到上面的问题,当我在搜索查询中添加“性别”时,它应该只查找国家为澳大利亚的女性用户。并非所有的女性都来自不同的国家。

因为你需要同时满足女性和国家的条件,所以应该是和

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

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

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();
["{"country":"Australia"}", "{"gender":"female"}"]
此外,由于您不知道执行查询的依据是什么,因此不应使用诸如
$和
$或
之类的运算符

您为所有用户准备的查询文档,其中
\u id
不等于
Meteor.userId()
国家
=澳大利亚
性别
=女性

另外,建议的解决方案是$and,因为
find
方法的查询文档中的所有条件都是隐式and


希望这能有所帮助。

我终于找到了解决办法。这是一个有点长的代码,但它做到了

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

  • 使用数组推送,我能够插入对象。例如:如果国家/地区不为空,则:

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

  • 其输出如下所示:

    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();
    
    ["{"country":"Australia"}", "{"gender":"female"}"]
    
    通过将其解析为JSON,它就变成了一个对象

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

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

    到目前为止,它工作得很好。:)

    你能不能通过编辑你的问题来澄清一下,包括一些示例文档和预期的输出,因为目前很难理解?如果所有文档的
    gender
    字段都是“female”,但具有不同的
    country
    值,那么为什么不能直接查询
    country
    字段呢?这是一个很好的建议,我尝试过,但当将gender或country设置为null或no值时,不会显示任何结果。我正在创建一个筛选搜索功能,有时某些字段可能为空或无值,这就是我决定使用“或”的原因,因此它可以忽略空值,只执行有值的字段。@website很有趣如果你真的“总是”想要性别为“女性”,那么这是一个“和”条件。这里唯一真正的调整是“所有”MongoDB查询条件都已经存在”和“条件,所以”{code>{u id:{“$ne”:Meteor.userId(),“country:“Australia”,“gender:“female”}
    ,或者如果您对国家值没有具体的了解,那么就在那里使用
    $或
    :{code>{u id:{“$ne”:Meteor.userId(),“gender:”female“,“$”或“:[{“country”:{“$in”:[“Australia”,null]},{“country”:{“$exists”:false}]}以适合数据的存储方式。@WebsiteIsFun Point是您在问题中描述的逻辑,表示“AND”,而不是“OR”。最多一个“OR”只适用于一个字段的多个可能值,如果该字段不存在,
    $in
    (值或
    null
    )中的
    $or
    )和
    $exists
    测试都涵盖了这些值。非常感谢您。让我试着用您的解决方案进行一些测试。