`
kisa77
  • 浏览: 28874 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

MongoDB学习笔记之五

阅读更多

  Inserting

 

    Document-Orientation

     在描述中,MongoDB是面向文档的,意味着在这种数据库中主要存储单位是Collection。

 

     一些常见的数据格式例如:JSON、XML、简单的键/值对。

 

     储存在MongoDB中的文档是一种类JSON格式,为了得到更高的效率,使用了一种二进制表现形式且被称为BSON的格式。目标是使数据更紧凑和合理以便于扫描。

 

     客户端序列化数据成BSON传送至数据库中,数据是以BSON格式被存储的。因此,读取数据的时候,数据库只需做很小的解析处理就可以传送出去,更加高效。然后客户端在反序列化BSON格式为当前语言使用的格式。

   JSON

    一段数据:

 

{ author: 'joe',
  created : new Date('03-28-2009'),
  title : 'Yet another blog post',
  text : 'Here is the text...',
  tags : [ 'example', 'joe' ],
  comments : [ { author: 'jim', comment: 'I disagree' },
              { author: 'nancy', comment: 'Good post' }
  ]
}
 

     存储的实例:

 

> doc = { author : 'joe', created : new Date('03-28-2009'), ... }
> db.posts.insert(doc);

 

   Mongo-Friendly Schema

     Mongo可以用于很多方面,第一反应或许是如何用它来编写一个使用关系数据库的应用程序。虽然这项工作非常好,但是也不能展现Mongo的真正力量。Mongo就是被设计和工作在副

 

   Store Example

 

  item
     title
     price
     sku
  item_features
     sku
     feature_name
     feature_value
 

    不同的商品有不同的属性,但又不想在一张表中包含所有可能出现的属性。(一般关系数据库中,可能都会另建属性表,跟分类表类似)在Mongo中同样可以创建这个模型,而且更加高效。

 

  item : {
           "title" : <title> ,
           "price" : <price> ,
           "sku"   : <sku>   ,
           "features" : {
              "optical zoom" : <value> ,
              ...
           }
  }

    这样做有几个好处:

    1、一次数据库查询可以得到整条记录。。

    2、一条记录的所有信息都书存储在硬盘的的同一片区域,所以一次检索可以可以得到所有数据。

    3、插入或更新单条属性时:

 

db.items.update( { sku : 123 } , { "$set" : { "features.zoom" : "5" } } )

    4、插入一条新属性不需要在硬盘上移动整条记录,Mongo有一个预留机制,预留出了一部分空间以适应数据对象的增长。也可以预防索引的增长等问题。

 

  Legal Key Names

    键的命名有以下限制:

   1. $不能出作为第一个字符

   2.(.)点不能出现在键名中

  Schema Design(数据库设计)

    Introduction

     在Mongo里,比起设计数据库关系模式,你只需做很少的标准化工作, because there are no server-side "joins"。通常来说,都希望每个顶级对象对应一个Collection。

     每一种分类都建立一个Collection,只需创建一个嵌入式对象。例如在下面的图中,我们有两个Collection,student和coureses。学生Collection中包含一个嵌入的address文档和coursesCollection有联系的score文档。

 

      如果用关系数据库来设计,几乎肯定会把score分离出来单独做一张表,然后加一个外键和student相连。

    Embed vs. Reference

      在Mongo数据库设计中关键的一句话是“比起嵌入到其他Collection中做一个子对象,每个对象值得拥有自己的Collection吗?”。在关系数据库中。每个有兴趣的子项目通常都会分离出来单独设计一张表(除非为了性能的考虑)。而在Mongo中,是不建议使用这种设计的,嵌入式的对象更高效。(这句不是很确定Data is then colocated on disk; client-server turnarounds to the database are eliminated)数据是即时同步到硬盘上的,客户端与服务器不必要在数据库上做周转。所以通常来说问题就是“为什么不使用嵌入式对象呢?”

 

      利用上面的例子,我们来看下为什么引用比较慢

 

print( student.address.city );

 

     address是嵌入式对象,所以这个操作通常是很快速的,如果sdudent被放在内存中,那address也通常在内存中。然而下面这个例子:

 

print( student.scores[0].for_course.name );

 

     如果是第一次访问scores[0]的内容,会先执行下面这句:

 

// pseudocode for driver or framework, not user code

student.scores[0].for_course = db.courses.findOne({_id:_course_id_to_find_});

 

     因此,每一次引用遍历都是一个数据库查询。一般来说,有问题的Collection都是默认的在_id建有索引,查询会稍微快一些。然而即使所有的数据都缓存在内存中,鉴于服务器端/客户端 的应用程序和数据库通信时仍然会有一些延迟。一般来说,期望在查询时缓存命中的境况下有1ms。因此,如果我们迭代1000 student,查找即使在有缓存的情况下仍然是很慢的,超过1m。如果我们只需要查找一条记录,时间应该在1ms左右,这对于一个网页加载来说是可以接受的。(注意:如果数据已经在缓存中,取出1000条数据也许花费时间少于1m,)

 

    一些规则:

   1、顶级对象,一般都有自己的Collection

   2、线性细节对象,一般作为嵌入式的

   3、一个对象和另一个对象是包含关系时通常采用嵌入式设计

   4、多对多的关系通常采取引用设计

   5、只含有几个简单对象的可以单独作为一个Collection,因为整个Collection可以很快的被缓存在应用程序服务器内存中。

   6、在Collection中嵌入式对象比顶级对象更难引用。as you cannot have a DBRef to an embedded object (at least not yet).

   7、It is more difficult to get a system-level view for embedded objects. For example, it would be easier to query the top 100 scores across all students if Scores were not embedded.

   8、如果将要嵌入的数据量很大(很多M),你可以限制单个对象的大小

   9、如果性能存在问题,请使用嵌入式设计

原文 写道
* "First class" objects, that are at top level, typically have their own collection.
* Line item detail objects typically are embedded.
* Objects which follow an object modelling "contains" relationship should generally be embedded.
* Many to many relationships are generally by reference.
* Collections with only a few objects may safely exist as separate collections, as the whole collection is quickly cached in application server memory.
* Embedded objects are harder to reference than "top level" objects in collections, as you cannot have a DBRef to an embedded object (at least not yet).
* It is more difficult to get a system-level view for embedded objects. For example, it would be easier to query the top 100 scores across all students if Scores were not embedded.
* If the amount of data to embed is huge (many megabytes), you may reach the limit on size of a single object.
* If performance is an issue, embed.
 

  Use Cases

   来看几个实例

   1、客户/订单/订单项目

          订单必须作为一个Collection,客户作为一个Collection,订单项目必须作为一个子数组嵌入到订单Collection中

 

   2、博客系统

          posts应该作为一个Collection,auth可以作为一个单独的Collection,或者auth包含的字段很少,比如只有email,address之类的为了更高的性能,也应该设计为嵌入式的对象.

   Index Selection

    数据库设计的第二个方面是索引的选择,一般规则:在mysql中需要的索引,在Mongo中也同样需要.

 

  • _id字段是自动被索引的
  • Fields upon which keys are looked up should be indexed.
  • 排序字段一定建立索引.

 

 

(最近项目开始忙了,mongo的学习暂停一段时间,有空还会继续学习的)

 

 

 

 

  • 大小: 9.8 KB
分享到:
评论

相关推荐

    mongodb学习笔记资料

    mongodb学习笔记资料,从安装到操作库collection 对document的crud 索引 replicaSet sharding 备份与恢复

    MongoDB学习笔记

    自己在学习MongoDB的一些笔记,里面有各个查询选择器的使用截图,还有一些索引的介绍。

    Mongodb学习笔记.docx

    MongoDB 学习笔记 本文档是 MongoDB 学习笔记,涵盖了 NoSQL、Cache、运行平台等多个方面的知识点。 一、NoSQL 数据库 MongoDB MongoDB 是一个强大、灵活、可扩展性好的文档数据存储器,可以完成大部分关系数据库...

    MongoDB学习笔记思维导图.pdf

    本篇学习笔记将从基础操作到高级功能,详细阐述MongoDB的关键知识点。 首先,MongoDB的基本单元是集合(collection),类似于关系型数据库中的表,而集合中的元素称为文档(document),文档是键值对的集合,类似于...

    mongodb学习笔记

    mongodb学习笔记 MongoDB 是一个基于分布式文件存储的开源数据库系统,主要用于处理大量数据的存储和查询。以下是 MongoDB 的一些基本操作和技巧: 插入文档 MongoDB 中可以使用 `insert` 方法来插入文档,例如 ...

    MongoDB学习笔记1

    MongoDB 是一种流行的开源、非关系型数据库系统,以其灵活性、高性能和易用性而备受开发者青睐。在本文中,我们将深入探讨 ...在实际项目中,学习和掌握 MongoDB 及其驱动程序能够帮助你更好地应对现代数据存储需求。

    MongoDB学习笔记之GridFS使用介绍

    MongoDB的GridFS是一个强大的文件存储系统,专为在数据库中存储和检索大量小文件而设计。GridFS将文件拆分为多个数据块(chunk),每个块都有自己的文档存储在`fs.chunks`集合中,而文件元信息则保存在`fs.files`集合...

    MongoDB学习笔记思维导图

    总结的MongoDB的学习笔记,基本上包括了MongoDB的方方面面,每个知识点,都有示例代码,有需要的朋友,可以下载下来进一步补充完善。

    mongoDB学习笔记及工具.zip

    本压缩包“mongoDB学习笔记及工具.zip”包含了一些资源,帮助你深入理解和掌握MongoDB的相关知识。 1. **笔记(note.txt)**: 这个文件可能是对MongoDB的基础概念、安装过程、基本操作和进阶特性的详细记录。笔记...

    MongoDB学习笔记(六) MongoDB索引用法和效率分析

    MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...

    MongoDB_学习笔记

    ### MongoDB 学习笔记知识点详解 #### 一、MongoDB 命令行基础操作 **1.1 帮助命令** - **help**:显示 MongoDB shell 的基本帮助信息。 - **db.help()**:提供当前数据库的帮助信息。 - **db.mycoll.help()**:...

    MongoDB最详细学习笔记.txt

    MongoDB最详细学习笔记

    MongoDB学习总结笔记

    以下是对MongoDB学习的一些关键知识点的详细解释: 1. **MongoDB的基本概念**:MongoDB以集合(Collections)的形式存储数据,集合相当于关系型数据库中的表。集合内包含文档(Documents),文档是JSON格式的数据...

    MongoDB数据库学习笔记

    5. **设置MongoDB服务器**: - **方法一**:手动配置,包括创建数据、日志和配置文件目录,编写配置文件,并使用`mongod`启动服务。连接MongoDB可以通过`mongo`命令行客户端或者编程语言的驱动完成。 - **方法二**...

Global site tag (gtag.js) - Google Analytics