[英]Multiple $where queries in MongoDB
我試圖將以下查詢放在一起,但無法正常工作:
db.sss.find({
"pos": { "$gte": 200000, "$lt": 2000000 },
"$where": "(this.chr.letter != "X" && this.chr.no == 5) && (this.chr.letter != "X" && this.chr.no == 6) && (this.chr.letter != this.chr.letter)"
})
上面的條件我試圖在下面解釋:
chr.no = 5
和chr.no = 6
chr
中兩個對象/字典之間的chr.letter
不相同,也沒有X ,並且 示例輸出如下所示:
文檔"x_type":"8"
不滿足范圍條件。 文檔"x_type":"10"
無效,因為chr.no = 6的chr.letter =X。並且文檔"x_type":"14"
無效,因為chr.no = 5且chr.no = 6兩者具有相同的chr.letter = G
該數據庫包含以下文檔:
{
"_id":ObjectId("5441b57bb6d08aa98ee8d34f"),
"name":"A",
"pos":828288,
"s_type":1,
"sub_name":"B01",
"type":"Test",
"x_type":7,
"chr":[
{
"letter":"C",
"no":4
},
{
"letter":"C",
"no":5
},
{
"letter":"T",
"no":6
}
]
}{
"_id":ObjectId("5441b57cb6d08aa98ee8d350"),
"name":"A",
"pos":171878,
"s_type":3,
"sub_name":"B01",
"type":"Test",
"x_type":8,
"chr":[
{
"letter":"C",
"no":5
},
{
"letter":"T",
"no":6
}
]
}{
"_id":ObjectId("5441b57cb6d08aa98ee8d351"),
"name":"A",
"pos":871963,
"s_type":3,
"sub_name":"B01",
"type":"Test",
"x_type":9,
"chr":[
{
"letter":"A",
"no":5
},
{
"letter":"G",
"no":6
}
]
}{
"_id":ObjectId("5441b57cb6d08aa98ee8d352"),
"name":"A",
"pos":1932523,
"s_type":1,
"sub_name":"B01",
"type":"Test",
"x_type":10,
"chr":[
{
"letter":"T",
"no":4
},
{
"letter":"A",
"no":5
},
{
"letter":"X",
"no":6
}
]
}{
"_id":ObjectId("5441b57cb6d08aa98ee8d353"),
"name":"A",
"pos":667214,
"s_type":1,
"sub_name":"B01",
"type":"Test",
"x_type":14,
"chr":[
{
"letter":"T",
"no":4
},
{
"letter":"G",
"no":5
},
{
"letter":"G",
"no":6
}
]
}
我使用以下腳本創建了上面的數據庫:
from pymongo import MongoClient
from collections import defaultdict
db = MongoClient().test
sDB = db.sss
r = [["Test", "A", "B01", 828288, 1, 7, 'C', 4],
["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":{
"letter":i[6],
"no": i[7]} }},
True)
如何解決以上查詢?
我猜您在JavaScript和MongoDB之間混合了語法。
$ where由服務器端的JavaScript引擎執行,因此$ where語句必須符合JavaScipt的語法。 例如, this.chr.no == 5
實際上this.chr[index].no == 5
您期望的this.chr[index].no == 5
; 並且變量不可能同時等於兩個不同的值。 以下代碼供您參考:
var judge = function () {
var unexpect = "X";
var letter1 = unexpect, letter2 = unexpect;
for (var i in this.chr) {
var chr = this.chr[i];
if (chr.no == 5) {
letter1 = chr.letter;
} else if (chr.no == 6) {
letter2 = chr.letter;
}
}
if (letter1 != letter2 && letter1 != unexpect && letter2 != unexpect) {
return true;
}
return false;
};
db.sss.find({
"pos": { "$gte": 200000, "$lt": 2000000 },
"$and" : [{"chr.no" : 5}, {"chr.no" : 6}], // narrow range further
"$where": judge
}, {"x_type":1, "sub_name":1, "name":1, "pos":1, "s_type":1, _id:0});
我假設您的$where
邏輯有問題。 您的描述方式:
(this.chr.letter != "X" && this.chr.no == 5) &&
(this.chr.letter != "X" && this.chr.no == 6) &&
(this.chr.letter != this.chr.letter)
不會返回任何內容,因為this.chr.no
不能同時為5
和6
。 您最可能想擁有||
在您的括號之間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.