DB:mongo

来自bbxwiki
跳转至: 导航搜索

资源参考

  1. http://www.jb51.net/article/48217.htm
  2. http://www.cnblogs.com/OSLover/p/3251294.html
  3. http://www.jb51.net/article/49392.htm


小案例

  1. 迭代样例
// 迭代
load("sp.mgdb.utils.js");
 
var myDate = new Date();
var datetime = myDate.format("yyyy-MM-dd hh:mm:ss");
print(datetime);
 
var db = connect("collection-name");
var cursor = db.sent.find({"src":/我爱你/});
while (cursor.hasNext())
{
        var temp = cursor.next();
        print(temp["_id"] + "\t" + temp["src"]);
}
quit();


utils工具集

// 日期格式化
Date.prototype.format = function(format)
{
    var o =
    {
        "M+" : this.getMonth()+1, //month
        "d+" : this.getDate(),    //day
        "h+" : this.getHours(),   //hour
        "m+" : this.getMinutes(), //minute
        "s+" : this.getSeconds(), //second
        "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
        "S" : this.getMilliseconds() //millisecond
    }
    if(/(y+)/.test(format))
    format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));
    for(var k in o)
    if(new RegExp("("+ k +")").test(format))
    format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
    return format;
}
 
// ...


mongo vs sql search

  1. 检索样例
db.users.find() SELECT * FROM users
 
db.users.find({"age" : 27}) SELECT * FROM users WHERE age = 27
 
db.users.find({"username" : "joe", "age" : 27}) SELECT * FROM users WHERE "username" = "joe" AND age = 27
 
db.users.find({}, {"username" : 1, "email" : 1}) SELECT username, email FROM users
 
db.users.find({}, {"username" : 1, "_id" : 0}) // no CASE  // 即时加上了列筛选,_id也会返回;必须显式的阻止_id返回
 
db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) SELECT * FROM users WHERE age >=18 AND age <= 30 // $lt(<) $lte(<=) $gt(>) $gte(>=)
 
db.users.find({"username" : {"$ne" : "joe"}}) SELECT * FROM users WHERE username <> "joe"
 
db.users.find({"ticket_no" : {"$in" : [725, 542, 390]}}) SELECT * FROM users WHERE ticket_no IN (725, 542, 390)
 
db.users.find({"ticket_no" : {"$nin" : [725, 542, 390]}}) SELECT * FROM users WHERE ticket_no NOT IN (725, 542, 390)
 
db.users.find({"$or" : [{"ticket_no" : 725}, {"winner" : TRUE}]}) SELECT * form users WHERE ticket_no = 725 OR winner = TRUE
 
db.users.find({"id_num" : {"$mod" : [5, 1]}}) SELECT * FROM users WHERE (id_num MOD 5) = 1
 
db.users.find({"$not": {"age" : 27}}) SELECT * FROM users WHERE NOT (age = 27)
 
db.users.find({"username" : {"$in" : [NULL], "$exists" : TRUE}}) SELECT * FROM users WHERE username IS NULL // 如果直接通过find({"username" : NULL})进行查询,那么连带"没有username"的纪录一并筛选出来
 
db.users.find({"name" : /joey?/i}) // 正则查询,VALUE是符合PCRE的表达式
 
db.food.find({fruit : {$all : ["apple", "banana"]}}) // 对数组的查询, 字段fruit中,既包含"apple",又包含"banana"的纪录
 
db.food.find({"fruit.2" : "peach"}) // 对数组的查询, 字段fruit中,第3(0开始)元素是peach的纪录
 
db.food.find({"fruit" : {"$size" : 3}}) // 对数组的查询, 查询数组元素个数是3的记录,$size前面无法和其他的操作符复合使用
 
db.users.findOne(criteria, {"comments" : {"$slice" : 10}}) // 对数组的查询,只返回数组comments中的前十条,还可以{"$slice" : -10}{"$slice" : [23, 10]}; 分别返回最后10条,和中间10条
 
db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"})  // 嵌套查询
 
db.blog.find({"comments" : {"$elemMatch" : {"author" : "joe", "score" : {"$gte" : 5}}}}) // 嵌套查询,仅当嵌套的元素是数组时使用,
 
db.foo.find({"$where" : "this.x + this.y == 10"}) // 复杂的查询,$where当然是非常方便的,但效率低下。对于复杂查询,考虑的顺序应当是 正则 -> MapReduce -> $where
 
db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"}) // $where可以支持javascript函数作为查询条件
 
db.foo.find().sort({"x" : 1}).LIMIT(1).skip(10); // 返回第(10, 11]条,按"x"进行排序; 三个LIMIT的顺序是任意的,应该尽量避免skip中使用large-NUMBER


参见