MongoDB Shell 操作示例

官方教程:https://docs.mongodb.com/manual/reference/method/

1、连接数据库

db = connect("localhost:27017");  // 连接数据库
db = db.getSiblingDB("victory");  // 选择 victory 数据库

以上代码和下面一行用法相同

db = connect("localhost:27017/victory","用户名","密码");  // 连接数据库

2、遍历输出集合数据

第一种方式:使用游标

var cursor = db.channel.find();	  // 查询集合

while( cursor.hasNext() ){	  // 迭代输出结果
	printjson( cursor.next() );
}
// 关闭游标
cursor.close();

第二种方式:使用forEach

use victory;
print("选择数据库 victory ");

 遍历输出结果
db.channel.find().forEach(
    function(item){  
        printjson(item);
    }
);

注:printjson(obj)与print(tojson(obj)) 用法一样

3、修改Collection

db.channel.updateMany({},{$set:{"priority":1}})

观察到,数据其实保存到是Double类型,并非我所需要的Int32类型。

修改类型如下,增加一个NumberInt转换

db.channel.updateMany({},{$set:{"priority":NumberInt(1)}})

// 替换,替换操作,没有$set,更新某个字段值,需要加上$set

db.article.update({"_id":articleId},{"priority":priority});

// 更新

db.article.update({"_id":articleId},{$set:{"priority":priority}});

完整实例

有4张表,Article文张表、articleChannelRel文章频道关联表、channel频道表、headlineArticle头条文章表,现在articleChannelRel和channel表要废弃,需要将“推荐”频道的文章关联的信息,记录到article表中。

articleChannelRel 表中有 priority、fixPosition两个字段,

  • priority:表示重要度1(普通)、2(醒目)、3(头条文章,对应headlineArticle表数据)

  • fixPosition:表示固定文章

操作步骤

1、连接数据库

2、查找channel表的推荐频道id

3、查找articleChannelRel表的文章关联信息,取出关联的重要度,根据重要度进行记录对应的article和headlineArticle,取出固定文章的文章id,设置article表。

/**----------------------------  连接数据库  ----------------------------------------**/
db;

use victory;
print("选择数据库 victory ");

//db = connect("localhost:27017");  // 连接数据库
//db = db.getSiblingDB("victory");  // 选择 victory 数据库

db = connect("远程IP:端口/victory","用户名","密码");  // 连接数据库
/**---------------------------------------------------------------------------------**/

// 文章总数
db.article.count();
// 频道推荐关联表【醒目类型】总数
db.articleChannelRel.find({
    "channelId":"1b5d3062-f479-4ff5-b91e-d51093a9d116",
    "priority":2
}).count();
// 频道推荐关联表【醒目和头条类型】总数
db.articleChannelRel.find({"channelId":"xxxx-xxxx-xxxx-xxxx-xxxx","priority":{"$gt":1}},{creationDate:0,lastModifiedDate:0}).count();

/**----------------------------------------------------------------------------**/


/**
 * 生成常用的UUID,Mongo默认的UUID方法不满足常规需求
 */
function ToGUID(hex) {
    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
    var b = hex.substr(10, 2) + hex.substr(8, 2);
    var c = hex.substr(14, 2) + hex.substr(12, 2);
    var d = hex.substr(16, 16);
    hex = a + b + c + d;
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
    return uuid;
}

/**
 * 保存头条数据到 HeadlineArticle
 */
function saveHeadlineArticle(articleId){
	// 查询 article 文章详情
	db.article.find({"_id":articleId},{title:1, status:1}).forEach(
    		function(item){
            var title = item.title;
            var status = item.status;
            var id = ToGUID(new BinData(3, ObjectId().str).hex());
			// 查询头条文章是否存在
			var count = db.headlineArticle.find({"articleId":articleId}).count();
			if(count > 0){
				print("头条文章 headlineArticle 已存在:", articleId);
				return;
			}
			// 插入 headlineArticle 头条文章
            var obj = {"_id":id, "articleId":articleId, "sequence":NumberInt(1), "articleTitle":title, "status": NumberInt(status), "createDate": new Date(), "modifyDate": new Date()};
            db.headlineArticle.insert(obj);
            
            print("【头条】往 headlineArticle 中插入一条头条数据", tojson(obj));
        }
    	);
} 

// 1、article 表所有文章 priority 设置为 1
db.article.updateMany({},{$set:{"priority":NumberInt(1)}});
// 2、删除固定文章 fixPosition 字段
db.article.updateMany({},{$unset:{"fixPosition":false}});


var tjId; // 推荐Id

// 3、读channel表,找到channelName=“推荐”的id
var channelCursor = db.channel.find({"channelName":"推荐"},{_id:1,channelName:1});
if(channelCursor.hasNext()){
  	var obj = channelCursor.next();
  	tjId = obj._id;
  	print("找到推荐Id:", tjId);	
}else{
	print("没有找到推荐ID");
}
// 关闭游标
channelCursor.close();

// 4、读articleChannelRel表channelId=id的列表
var articleChannelRelCursor = db.articleChannelRel.find({"channelId":tjId},{creationDate:0,lastModifiedDate:0});
while(articleChannelRelCursor.hasNext()){
  	var rel = articleChannelRelCursor.next();
  	var articleId = rel.articleId;
  	var priority = rel.priority;
  	var fixPosition = rel.fixPosition==undefined?"":rel.fixPosition;
  	
  	// print("文章id:" + articleId + ", 重要度:" + priority + ",是否固定:" + fixPosition);
  	
   // 5、重新设置 article 重要度
   if(priority > 1){
   		print("[重新设置文章 " + articleId + " 重要度(" + priority + ")]");
   		db.article.update({"_id":articleId},{$set:{"priority":NumberInt(priority)}});
   		
   		if(priority == 3){
   			print("【头条】往 headlineArticle 中插入一条头条 " + articleId + " 数据");
   			
    			// 保存头条数据到 headlineArticle
		    saveHeadlineArticle(articleId);
   		}
   }
   
   // 6、重新设置 article 固定文章
   if(fixPosition == true){
     	print("【固定】重新设置文章 " + articleId + " 为固定文章");
   		db.article.update({"_id":articleId},{$set:{"fixPosition":true}});
   }
}

// 关闭游标
articleChannelRelCursor.close();
// 7、已有头条文章headline
var headlineArticleCursor = db.headlineArticle.find({},{creationDate:0, lastModifiedDate:0});
while(headlineArticleCursor.hasNext()){
  	var headline = headlineArticleCursor.next();
  	var articleId = headline.articleId;  	
  	
  	print("【headlineArticle】重新设置article文章 " + articleId + " 为头条文章");
  	
  	// 重置article文章头条数据
  	db.article.update({"_id":articleId},{$set:{"priority":NumberInt(3)}});
    
}

// 关闭游标
headlineArticleCursor.close();


赞(52) 打赏
未经允许不得转载:优客志 » 数据库
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏