在我的收藏中,我有两个字段gender
和country
。
在gender
字段中,他们都是"女性"并且每个人都处于不同的country
。
我试图查询集合:
return Meteor.users.find(
{
_id: {$ne: Meteor.userId()},
$or: [ { "country": "Australia" }, { "gender": "" } ]
}).fetch();
结果如下:
将gender
设置为" null"或清空它给了我在澳大利亚的所有用户。
但是当我将gender
设置为"女性"和country
到"澳大利亚"它给了我来自不同国家的所有女性用户,这些用户应该只是female
来自澳大利亚。它似乎忽略了第一个参数,即country
。
有没有办法让它更准确?请帮忙谢谢。
我的目标是:
使数据库查询更准确,并且能够采用更改。
示例:
回到上面的问题,当我添加"性别"在搜索查询中,它应该只查找其国家/地区是澳大利亚的女性用户。不是所有来自不同国家的女性。
答案 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)
我终于找到了一个如何解决这个问题的解决方案。这是一个有点长的代码,但它做了伎俩。
我扫描了我得到的数据并删除了空数据,在上面的例子中,如果性别是==到“”然后忽略它,否则获取其数据(如果存在)。我是通过循环完成的。
使用数组推送我能够插入对象。例如:如果country不为null,则:
<强>可变强> .push( '{ “+ objectPropertyName [I] +”' + ':' + ' “ '+ objectValue [I] +'”}');
< / LI> 醇>输出如下:
["{"country":"Australia"}", "{"gender":"female"}"]
通过将其解析为JSON,然后成为一个对象。
一旦设置了查询所需的所有对象,我就可以通过以下方式查询mongo:
db.collection.find({"_id": {$ne: Meteor.userId()}, $and: **variable**}).fetch();
到目前为止它完美无缺。 :)