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
测试都涵盖了这些值。非常感谢您。让我试着用您的解决方案进行一些测试。