mapreduce
load("liyong11_lib.js")
function prepare_data(db)
{
data = [
{price:1, name:"Simplify Your Life"},
{price:1, name:"Getting Things Done"},
{price:1, name:"The War of Art"},
{price:2, name:"Jane Eyre"},
{price:2, name:"War and Peace"},
{price:3, name:"Hong Lou Meng"},
{price:3, name:"Xi You Ji"},
{price:3, name:"Sango Yanyi"}
]
data.forEach(function(doc){
db.book.insert(doc)
})
}
/*
Purpose:
Count the books of the same price, but not the books with price 1.
*/
function map_fn()
{
emit(this.price.toString(), {name:this.name})
}
function reduce_fn(key, values)
{
var sum = 0;
values.forEach(function(doc){
sum += 1;
})
return sum
}
function finalize_fn(key, value)
{
return "count:" + value.toString()
}
function test()
{
var db = connect("liyong11_search_test")
db.book.remove()
prepare_data(db)
var res = db.runCommand({"$query":{price:1}, "$limit":1})
res = db.runCommand(
{
mapreduce:"book",
map:map_fn,
reduce:reduce_fn,
out:"result_collection_name",
finalize:finalize_fn,
query:{price:{"$ne":1}}
})
printjson(res)
print_collection(db, "result_collection_name")
}
test()
update
function prepare_update_data(db)
{
data =
[
{name:"Tom", age:5},
{name:"Jerry", age:3}
]
data.forEach(function(doc){
db.test.insert(doc)
})
}
function test_update_upsert()
{
var db = connect("test")
db.test.remove()
prepare_update_data(db)
// 开始查询
// (查询条件,更新,查不到是否插入,是否更新多条数据)
db.test.update(
{
name:"Jerry"
},
{
// set设置某个域的值
$set:{name:"Tom"},
// push为符合条件的记录添加新的域和值。
"$push": {new_field_name: "value"}
},
upsert = true, // 默认为假
multi = true // 默认为假
)
// 注意!find的结果不是一个object,而是一个cursor
var cursor = db.test.find()
while (cursor.hasNext())
{
printjson(cursor.next())
}
}
test_update_upsert()
aggregate
function prepare_data_aggregation(db)
{
data =
[
{key:"1", v1:"1", v2:3},
{key:"1", v1:"1", v2:3},
{key:"4", v1:"1", v2:3},
{key:"2", v1:"1", v2:2},
{key:"2", v1:"1", v2:2},
{key:"2", v1:"1", v2:2},
{key:"3", v1:"2", v2:2},
{key:"3", v1:"2", v2:2}
]
data.forEach(function(doc){
db.test.insert(doc)
})
}
function test_aggregation()
{
var db = connect("test")
db.test.remove()
prepare_data_aggregation(db)
var res = db.runCommand(
{
"aggregate":"test",
"pipeline":
[
{
$group:
{
_id:{key:"$key", v1:"$v1"}, // 指定需要的域
avg_v2:{$avg:"$v2"}, // 求平均值(注意,对应域应该是数值类型)
count:{$sum:1} // 求每个组的数量
}
},
// _id默认存在,不需要则置零
// 其他域默认不存在,如果需要则置一
{
$project:{_id:1, count:1, avg_v2:1}
},
// 匹配条件
{
$match:{avg_v2:{$gt:1}}
},
// 多字段排序
{
$sort: {avg_v2:-1}
},
{
$skip : 1
},
{
$limit: 20
}
]
}
);
printjson(res)
}
test_aggregation()
delete_too_large_geom
db = connect("info_test")
for (size = 1000; size < 10000; ++size)
{
res = db.inte_road_reform.find({"geom.coordinates":{$size: size }})
res.forEach(function(doc){
print(doc.mid)
/*db.inte_road_reform.remove({mid: doc.mid})*/
})
}
distinct
function prepare_distinct_data(db)
{
data =
[
{f1:1,f2:3},
{f1:2,f2:2},
{f1:3,f2:1},
{f1:3,f2:1}
]
data.forEach(function(doc){
db.test.insert(doc)
})
}
function test_distinct()
{
var db = connect('test')
prepare_distinct_data(db)
var res = db.runCommand(
{
distinct:'test',
key: 'f1', // 只支持对单个域的distinct。多个域可以用group来实现。
query:
{
f1: {$gt:0}
}
})
// 查询的结果是distinct的域的所有不同值的集合
printjson(res)
}
test_distinct()
find_document_with_boolean_value
db_name = "info_test"
table_name = "inte_road_record"
db = connect( db_name )
fields = ["mid","info_id","task_id","province","city","district","linkname","roadtype","roadform","road_length","state","update_type","completion_time","appendix","intelligence_source","baidu_status","gaode_status","soso_status","souge_status","info_times","close_time","resolve_time"]
for (field in fields){
field = fields[field]
code ='typeof this.' + field + ' == "boolean"'
cnt = db[ table_name ].count({$where: code })
if (cnt > 0) {
print(field, cnt)
db[ table_name ].find({$where: code}).forEach(function(doc){ printjson(doc) })
}
}
group
function prepare_group_data(db)
{
data =
[
{v1:"1", v2:3},
{v1:"1", v2:3},
{v1:"1", v2:2},
{v1:"1", v2:2},
{v1:"2", v2:2},
{v1:"2", v2:2},
{v1:"2", v2:4},
{v1:"2", v2:4}
]
data.forEach(function(doc){
db.test.insert(doc)
})
}
function test_group(db)
{
var res = db.test.group(
{
// 首先按照v1分组,再按照v2分组
key:{
'v1':1,
'v2':1
},
// 只对满足条件的document进行操作
cond: {v2:{$lt:99}},
// 聚合操作
reduce: function(in_doc, out_doc)
{
out_doc.v1 = in_doc.v1 + 1;
out_doc.v2 = in_doc.v2 + 1;
},
// 每条符合条件的记录在被操作前的被添加初值
initial:{ "undefined_key":"initial_value"},
// 最后再补一刀
finalize: function (out_doc)
{
out_doc.v1 = "finalize" + out_doc.v1
}
})
printjson(res)
}
function test_group_c(db)
{
var res = db.runCommand(
{
"group":
{
ns:'test',
key:
{
v1:1,
v2:1
},
initial: {},
$reduce: function(in_doc, out_doc)
{
out_doc.v1 = in_doc.v1 + "$reduce"
},
cond:
{
v2: {$gt:0}
},
finalize: function(doc)
{
doc.v2 += 100
}
}
}
)
printjson(res)
}
function test()
{
var db = connect("test")
db.test.remove()
prepare_group_data(db)
// test_group(db)
test_group_c(db)
}
test()
view_collection
function print_collection(db, name)
{
var res = db[name].find().limit(50)
res.forEach(function(doc){
printjson(doc)
})
}