Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MongoDB';s$elemMatch未找到正确的结果_Python_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

Python MongoDB';s$elemMatch未找到正确的结果

Python MongoDB';s$elemMatch未找到正确的结果,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,下面是一个小型MongoDB数据库: > db.sss.find().pretty() { "_id" : ObjectId("543f53b8711761110238be74"), "name" : "A", "pos" : 828288, "s_type" : 1, "sub_name" : "B01", "type" : "Test", "x_type" : 7, "chr" : [ {

下面是一个小型MongoDB数据库:

> db.sss.find().pretty()
{
    "_id" : ObjectId("543f53b8711761110238be74"),
    "name" : "A",
    "pos" : 828288,
    "s_type" : 1,
    "sub_name" : "B01",
    "type" : "Test",
    "x_type" : 7,
    "chr" : [
        {
            "5" : "C"
        },
        {
            "6" : "T"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be75"),
    "name" : "A",
    "pos" : 171878,
    "s_type" : 3,
    "sub_name" : "B01",
    "type" : "Test",
    "x_type" : 8,
    "chr" : [
        {
            "5" : "C"
        },
        {
            "6" : "T"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be76"),
    "name" : "A",
    "pos" : 871963,
    "s_type" : 3,
    "sub_name" : "B01",
    "type" : "Test",
    "x_type" : 9,
    "chr" : [
        {
            "5" : "A"
        },
        {
            "6" : "G"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be77"),
    "name" : "A",
    "pos" : 1932523,
    "s_type" : 1,
    "sub_name" : "B01",
    "type" : "Test",
    "x_type" : 10,
    "chr" : [
        {
            "4" : "T"
        },
        {
            "5" : "A"
        },
        {
            "6" : "X"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be78"),
    "name" : "A",
    "pos" : 667214,
    "s_type" : 1,
    "sub_name" : "B01",
    "type" : "Test",
    "x_type" : 14,
    "chr" : [
        {
            "4" : "T"
        },
        {
            "5" : "G"
        },
        {
            "6" : "G"
        }
    ]
}
已使用以下脚本创建上述数据库:

from pymongo import MongoClient
from collections import defaultdict


db = MongoClient().test
sDB = db.sss

r = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]

for i in r:
    sDB.update({'type': i[0],
          'name': i[1],
          'sub_name': i[2],
          'pos': i[3],
          's_type': i[4],
          'x_type': i[5]},
          {"$push": {"chr":{str(i[7]): i[6]} }}, True)
我开始编写以下条件的查询:

  • x\u type:7
    x\u type:9
    是正确的,因为
    chr.5
    chr.6
    具有不同的字符,并且它们都没有字符x
  • x_type:8
    正确,但超出范围(200000到2000000)
  • x\u type:10
    无效,因为
    chr.6
    包含一个x
  • x\u type:14
    无效,因为
    chr.5
    chr.6
    具有相同的字符
但是,通过以下草案查询,我没有得到我想要的:

> db.snps.find({"pos": {$gte: 200000, $lt: 2000000}}, {"chr":{$elemMatch:{"6":{$ne: "X"}}}}).pretty()
{
    "_id" : ObjectId("543f53b8711761110238be74"),
    "chr" : [
        {
            "5" : "C"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be76"),
    "chr" : [
        {
            "5" : "A"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be77"),
    "chr" : [
        {
            "4" : "T"
        }
    ]
}
{
    "_id" : ObjectId("543f53b8711761110238be78"),
    "chr" : [
        {
            "4" : "T"
        }
    ]
}

我做错了什么?

您似乎使用了错误的形式,因为您使用的是“投影”形式,用于选择数组中第一个与您提供的条件匹配的。此处指定的唯一“查询”条件是“pos”值在请求的范围内

如果您想要的是,当文档的“pos”值在范围内,并且“chr.6”中没有“X”值时,这两个条件都存在。在比较数组元素的值时,final和additional子句有点棘手。但这在JavaScript计算中是可能的,而且相当简单,只要只有且始终有两个元素:

db.snps.find({
“pos”:{“$gte”:200000,$lt:2000000},
“chr.6”:{“$ne”:“X”},
“$where”:“this.chr[0]['5']!=this.chr[1]['6']”
})
对于其他组合或命名元素来说有点棘手,但JavaScript计算的相同原则适用于该条件


由于只测试数组元素的一个字段,所以不需要此处的查询表单,因此投影位置错误。您需要什么“查询”条件来选择满足这些条件的文档。

什么是示例输出。。!!!!示例输出将是
{name:“a”,“pos”:828288,“s_type”:1,“sub_name:“B01”,“type:“Test”,“x_type”:7}
谢谢,我尝试在下面的查询
db.snps.find({“pos:{gte:”200000”,“lt:”2000000},{“{”或“{”chr.5:{chr.5:”或“chr.6”中不应该有“x”值,但没有成功},“chr.6”:{“$ne”:“X”}]},“$where”:“this.chr[0]['5']!=this.chr[1]['6']”})
。为了检查
where
是否适用于包含两个以上元素的列表,我删除了不允许X的条件。然而,我没有得到额外的
x_type:10
@user977828我和其他人只能根据你如何提出你的问题来回答。如果你有另一个问题或不同的情况,那么你真的应该发布另一个问题。上面显示的查询条件应该满足您在问题中指定的条件。