pymongo中$和运算符的正确用法是什么?

时间:2015-05-14 12:02:53

标签: python mongodb pymongo

我有这个结构:

>>>test_3.find_one({"humsavar.Disease": {"$exists": True}}, 
{"humsavar":True, "_id":False})

{u'humsavar': [{u'Association': u'Polymorphism',
   u'Disease': u'-',
   u'Gene names': u'DTWD1',
   u'Mutate aa': u'Pro',
   u'Position aa': 9,
   u'Reference aa': u'Leu',
   u'Substitution': u'Leu9Pro',
   u'SwissVarID': u'VAR_036757',
   u'Uniprot': u'Q8N5C7',
   u'dbSNP': u'rs11539522'},
  {u'Association': u'Polymorphism',
   u'Disease': u'Pyruvate dehydrogenase lipoic acid synthetase deficiency',
   u'Gene names': u'DTWD1',
   u'Mutate aa': u'Lys',
   u'Position aa': 13,
   u'Reference aa': u'Glu',
   u'Substitution': u'Glu13Lys',
   u'SwissVarID': u'VAR_036758',
   u'Uniprot': u'Q8N5C7',
   u'dbSNP': u'rs11539519'}]}

我是否应该使用以下查询进行搜索,以计算患有疾病和dbSNP的humsavar的所有文件?

test_3.find({"$and": [{"humsavar.Disease": {"$ne": u'-', "$exists":  True}},
 {"humsavar.dbSNP": {"$ne": u'-', "$ne": None, "$exists":  True}}]},
{"humsavar":True, "_id": False}).count()
# output 32

我希望这个查询有一个类似的数字:

test_3.find({"$and": [{"humsavar.Disease": {"$ne": u'-', "$ne":None, "$exists":  True}},
 {"humsavar.dbSNP": {"$ne": u'-', "$ne": None, "$exists":  True}}]},
 {"humsavar":True, "_id": False}).count()

但结果是8499

2 个答案:

答案 0 :(得分:3)

你的上一个查询返回太多文档,因为在python中你不能真正在dict中包含重复的键,如:

{"$ne": u'-', "$ne":None, "$exists":  True}

这会导致"$ne"的第二次出现覆盖第一次,以

的词典结尾
{"$ne":None, "$exists":  True}

这一切都发生在python-interpreter层中,然后传递给pymongo驱动程序。

如果您想在单个字段上使用多个$ne条件,则可以使用$nin(“not in”)运算符。

答案 1 :(得分:2)

来自$and使用的MongoDB文档。

  

MongoDB在指定逗号分隔的表达式列表时提供隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用带有$和运算符的显式AND。

您只需要使用int运算符作为重复字段名称。 $andhumsaver.Diseasehumsaver.dbSNP的条件将是隐含的。 (虽然使用humsavar会给你相同的结果)。

$and