【问题标题】:MongoDB Query Find multiple fields or documents properlyMongoDB Query 正确查找多个字段或文档
【发布时间】:2016-03-01 08:34:57
【问题描述】:

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

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

我尝试查询集合:

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

结果如下:

当将gender 设置为“null”或为空时,它会给我所有在澳大利亚的用户。

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

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

我的目标是:

使数据库查询更准确,并能适应变化。

例子:

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

【问题讨论】:

  • 您能否通过编辑它以包含一些示例文档和预期的输出来澄清您的问题,因为目前很难理解?如果所有文档的 gender 字段为“女性”,但 country 值不同,那为什么不能只查询 country 字段?

标签: mongodb


【解决方案1】:

既然你需要同时满足女性和国家的条件,那就应该是和

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

【讨论】:

  • 一个好建议,我试过了,但是当将性别或国家设置为空或无值时,它不会显示任何结果。我正在创建过滤器搜索功能,有时某些字段可能为空或无值,这就是我决定使用“OR”的原因,因此它可以忽略空值并仅执行具有值的字段。
  • @WebsiteIsFun 如果你真的“总是”想要“女性”的性别,那么它一个“AND”条件。这里唯一真正的调整是“所有” MongoDB 查询条件已经是“AND”条件,所以{ "_id": { "$ne": Meteor.userId(), "country": "Australia", "gender": "female" } 或者如果你真的不具体了解国家/地区值,那么使用$or 就在那里:{ "_id": { "$ne": Meteor.userId(), "gender": "female", "$or": [{ "country": { "$in": ["Australia",null] }, { "country": { "$exists": false } }] } 适合但是数据会被存储。
  • @WebsiteIsFun Point 是您在问题中描述的逻辑表示“AND”而不是“OR”。最多一个“或”只适用于一个字段的多个可能值,被$in(一个值的缩写$ornull)和$exists测试覆盖甚至在场。
【解决方案2】:

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

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 = AUSTRALIA gender = 女性。

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

希望这会有所帮助。

【讨论】:

  • 非常感谢。 .让我尝试对您的解决方案进行一些测试。 .
【解决方案3】:

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

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

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

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

这个输出看起来像这样:

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

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

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

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

到目前为止,它运行良好。 :)

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2013-03-21
    相关资源
    最近更新 更多