2014-10-19 119 views
1

的JavaScript部分中有以下的MongoDB查詢感謝到https://stackoverflow.com/a/26436244/977828我如何端口的MongoDB查詢PyMongo

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 }, 
    "$where": judge 
}, {"x_type":1, "sub_name":1, "name":1, "pos":1, "s_type":1, _id:0}); 

我試圖端口上面查詢到PyMongo,但我不知道在哪裏把JavaScript函數。

from pymongo import MongoClient 

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) 

# 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; 
# }; 

results = sDB.find({ 
         "pos": { "$gte": 200000, "$lt": 2000000}, 
         "$where": judge 
        }, 
        {"x_type":1, "sub_name":1, "name":1, "pos":1, "s_type":1, "_id":0}) 

for i in results: 
    print i 

如何將JavaScript函數集成到PyMongo中?

回答

1

使用PyMongo,您應該能夠將JavaScript的$where作爲字符串傳遞,例如,像這樣:

# JavaScript as multiline string 
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; 
}; 
""" 

results = sDB.find({ 
     "pos": { "$gte": 200000, "$lt": 2000000}, 
     "$where": judge 
    }, 
    {"x_type":1, "sub_name":1, "name":1, "pos":1, "s_type":1, "_id":0})