mongodb 修改数据结构的一个例子以及小梳理

mongodb的存储结构是灵活可变的,但是,并不意味着我们就肆意地使用不规则的文档结构。不规则的文档结构对于开发和后期的维护都是一个灾难。所以,还是要有一个约定的格式。

但是,由于前期设计的不周详和其他种种原因,数据库文档结构在开发过程的中修改总是难以避免的,应该尽量减少这种修改。但是,到了必须改的时候还是得改:

 1 {
 2 "_id" : ObjectId("54a1f775e4b03dad3af55c3c"),
 3 "myId" : "54a0b115e4b00712935204ba",
 4 "name" : "action",
 5 "key" : "m_0",
 6 "index" : 0,
 7 "createTime" : ISODate("2014-12-30T00:53:09.483Z"),
 8 "subMs" : [
 9 {
10 "_id" : null,
11 "rm" : {
12 "mt" : "TEXT",
13 "content" : "撒东西"
14 },
15 "name" : "地说道",
16 "key" : "menu_0_0",
17 "type" : "CLICK"
18 }
19 ]
20 }
21 {
22 "_id" : ObjectId("54b87996e4b04b29b92a71b1"),
23 "myId" : "54b5e8cce4b045d4121f5d63",
24 "rm" : {
25 "msgType" : "URL",
26 "url" : "http://www.abc.com"
27 },
28 "name" : "usercenter",
29 "key" : "user-center",
30 "type" : "VIEW",
31 "index" : 0,
32 "createTime" : ISODate("2015-01-16T02:38:14.643Z")
33 }]
34
35 }

有很多这样类型的文档。 这个文档中的subMs字段中内嵌有若干个文档。要做的事情就是把subMs中的若干个文档脱离出来成为一个独立的文档,并且使新拆出来的文档保留原父文档的id。

脚本如下:

 1 var mList = db.m.find();
 2 var mLength = mList.length;
 3 var mArray = new Array();
 4 // 这一步比较关键,因为find 方法会返回一个游标,
 5 // 如果不先关闭,或者将此游标用完,接下来在继续往
 6 // mongodb中插入数据会导致该游标发生混乱。
 7 // 所以此处未往mongodb中修改前先把游标用完。
 8 while(mList.hasNext()) {
 9     mArray.push(mList.next());
10 }
11 for(var i = 0; i < mLength; i ++) {
12     var mItem = mArray.pop();
13     var sMList = mItem.subMs;
14     mItem.subMs = new Array();
15     if(sMList == 0 || sMList.slength == 0) {
16         continue;
17     }
18     var sMLength = sMList.slength;
19     for(var j = 0; j < sMLength; j ++) {
20         var sMItem = sMList.pop();
21         sMItem.pid = mItem._id.str;
22         sMItem.index = j;
23         sMItem.subMs = new Array();
24         sMItem._id = undefined;
25         db.m.insert(sMItem);
26     }
27     db.m.save(mItem);
28 }

第一次写起来还是有点吃力,

第一,是由于js的非常不熟悉。翻了好几次w3school才看出了点东西。

第二,是对mongodb查询游标的理解。

第三,mongo shell, 有个好东西, 当敲一个命令的时候,不敲后边跟上的括号,就能显示该命令底下将会执行的js方法。

比如以下命令:

>  db.m.find   回车后会显示对应的方法。

另外,有个挺好用的mongodb客户端:robomongo 值得推荐。

时间: 2024-11-09 00:21:32

mongodb 修改数据结构的一个例子以及小梳理的相关文章

一个简单的小例子让你明白c#中的委托-终于懂了!

模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事件委托给多个嘉宾去处理.因此在Host 类定义事件,在Guests类中定义事件的响应方法.通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件.实现过程如下: 代码其实很少下面贴出来所有代码: QuestionArgs.cs view plaincopy to

【C语言探索之旅】 第一部分第八课:第一个C语言小游戏

? 内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文

CSAPP中一个有意思的小东西

回家的效率明显下降了,但是第三章还是快要结束的节奏.今天看到定长数组这里的时候,看到一个好玩的东西.在计算机的底层中,所有对数组的操作都是利用指针来完成的.数组其实也是一个很简单的数据结构,就是把一些最简单的数据类型合并在一段连续的内存区域上,这就是一个复合类型---数组. 学C语言的时候,大家都知道访问数组元素有两种方法,一种是利用数组名加索引的形式,另外一种就是利用指针加上偏移量的形式.在底层中,不管你用什么方式来访问元素,最后多会转化成对指针的操作. 在编写 代码的时候,编译器在编译过程中

C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 一.为什么要使用委托 委托的应用之一:将一个方法作

Unity的Write Defaults-&gt;从一个例子谈起

Write Defaults是什么? 在Unity的Animator中点击任何一个手动创建的State,我们就会在Inspector面板中看到下图的WriteDefaults选项 先说说Write Defaults的作用(文档中语焉不详,下面解释掺杂一些本人的理解,不一定完全正确):任何一款引擎内部处理动画,都是处理的一个个具体的动画曲线.对于Unity来说,每一个动画曲线只改变一个浮点数,比如位置的修改,其实是包含了三条动画曲线,这里就不展开了,日后有机会写一些相关的Blog.每个动画文件都描

用backbone实现的一个MVC的小demo

一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> DocumentRoot "D:/htdocs/backbone_demo" ServerName www.backbonedemo.cn </VirtualHost> 在windows的hosts文件中添加配置,hosts文件的位置在c:\windows\system32

javascript闭包的一个例子

<html> <head> <title>elementFromPoint</title> <script type="text/javascript"> window.onload = function(){ for(var i=0; i<6; i++){ var alink = document.createElement('a'); var titleText = document.createTextNode('

使用springAPI以及自定义类 实现AOP的一个例子-aop编程

Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们现在需要在针对数据库进行CRUD操作时添加一组日志,即在执行CRUD方法前后分别加上一句话,实现简单的面向切面编程的功能.我用到的是spring4,在配置文件上较之之前的版本可能有些不同. 使用springAPI来实现AOP,除了spring必不可少的核心jar包,还需要两个jar包需要导入: as

通过一个例子感受C# 6.0新特性

微软在Visual Studio 2015中更新C#语言到6.0,添加了很多很好的特性,以使C#语言继续跻身于最优秀语言之行列.下面通过一个例子快速感受一下C# 6.0的新特性,以下程序在VS2015预览版中测试通过,正式版可能还要添加新特性. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Syste