神奇的mongo:JS操作mongo的代码

本文详细介绍MongoDB中各种常用操作,包括数据准备、MapReduce、更新操作、聚合管道使用、分组操作等,并通过具体实例展示如何进行复杂的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
	})
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值