Python MongoDB';s$elemMatch未找到正确的结果
下面是一个小型MongoDB数据库: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" : [ {
> 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
具有不同的字符,并且它们都没有字符xchr.6
正确,但超出范围(200000到2000000)x_type:8
无效,因为x\u type:10
包含一个xchr.6
无效,因为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我和其他人只能根据你如何提出你的问题来回答。如果你有另一个问题或不同的情况,那么你真的应该发布另一个问题。上面显示的查询条件应该满足您在问题中指定的条件。