mongodb与mongoose

2016-01-13 22:00:00
何定鑫
原创 1679
摘要:mongodb与mongoose个人理解

知识没学好专业概念不是很精通,按照平时做出来的问题处理见解等,请大家指教

模型是数据库存在对应关系,每个对象模型的属性对应一个字段,当存在模型变化数据库怎么变化?

1,个人认为增加字段(感觉太傻)(对于关系型数据库还好随手增加一个字段~对于非关系型数据库太恶心因为每个文档都需要增加一个字段~)

2,删除数据库(也傻,影响数据增加多余操作)

之前做过EF框架 采用 ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,存放在专门的对象一映射文件中。简单话如果模型改变了,可以自动更新数据库,数据库变了可以更新模型,挺好也不好

(知乎)ORM有一个问题是,当你的需求从简单变成不太简单的时候,会因为ORM无法支持多出来的那部分,导致原有的东西也不能用ORM,然后整个数据层就要重写了。

譬如说,分库分表啊、update if exists啊……

========================================

小项目用orm没问题,但是一个未来会变大的小项目用orm就是个问题了。所以我的建议是,除非你有确凿的证据认为,这个项目不会变大,那你才能用orm。

而mongodb没有ORM层,mongoose有ORM能够一一对应,现在总结


非ORM模式下的mongodb增加字段JS命令

关于读的操作

db.collection[表名].find(

{age:{$gt:18}},//年龄大于18的  $gt//大于 $lt小于

{name:1,address:1}//等价于sql语句的 SELECT _id,name,address紧紧返                                  //回_id,name,address字段 这里是映射下文提及

).limit(5)//限制为5个返回的文档

映射

在 MongoDB 里,查询默认返回所有匹配文档里的全部字段。想要限制 MongoDB 发送给应用的数据量,可以在查询里包含  projection 。通过映射包含字段子集的结果,应用可以降低他们的网络开销并且处理需求。

映射,它是  find() 方法的  第二个 参数,既可以指定结果文档里要返回的字段列表,  可以指定不包含的字段列表

为1包含在字段 为0不包含该字段

如:


                        db
                        .
                        records
                        .
                        find
                        ( 
                        { 
                        "user_id"
                        : 
                        { 
                        $lt
                        : 
                        42
                        } 
                        }, 
                        { 
                        "_id"
                        : 
                        0
                        , 
                        "name"
                        : 
                        1 
                        , 
                        "email"
                        : 
                        1 
                        } 
                        ) 

此查询从 records 集合里选择匹配条件  {  "user_id":  {  $lt:  42  }  } 的文档,并且在结果集文档里仅仅返回 name 和 email 字段。

而对于某些内含有的字段集合如ratings中有五个字段如果只要改集合的前两个字段

可以使用

 投影操作符 $elemMatch  ,  $slice  以及  $  


下面的操作使用  $slice 映射操作符以仅仅返回 ratings 数组里的前两个元素。

                        db
                        .
                        inventory
                        .
                        find
                        ( 
                        { 
                        _id
                        : 
                        5 
                        }, 
                        { 
                        ratings
                        : 
                        { 
                        $slice
                        : 
                        2 
                        } 
                        } 
                        )

查询行为

MongoDB 查询表现出以下行为:

  • 在 MongoDB 中,所有的查询都处理  单个 集合。

  • 你可以使用  limit ,  skip 和  sort  order 来修饰查询。

  • 如果你未指定  sort() ,那么通过查询返回的文档顺序是未定义的。

  • :doc:` 修改存在的文档 </tutorial/modify-documents>` 操作(例如  updates)使用相同的查询语法作为查询条件来选择要更新的文档。

  • 在 :doc:` 聚合 </core/aggregation>` 管道中,  $match 管道阶段提供通向 MongoDB 查询的途径。

MongoDB 提供了  db.collection.findOne() 作为  find() 方法的一个特例,它只返回一个文档。

写操作

v3.2新功能

db.users.insertOne({

  name:'xin',

  age:26,

  status:'oending'

})



db.users.insertMany([

{

  name:'xin',

  age:26,

  status:'oending'

},


{

  name:'xin',

  age:26,

  status:'oending'

},

.........


])

(可以试试!)


更新

v2.6版中


          db
          .
          collection
          .
          update
          ( {
          <
          query
          >}
          , //查询语句为空即所有
          {<
          update
          >}
          , //更新操作,!!
详细说明更新的操作会替换全部字段
注key:value或数组表达
            tags
            : 
            [ {key:
            "literature"
            , key2:
            "translated"} 
            ]
//得到tags.0.hey tags.0.key2
            tages:{
            tag1:
            ''
            ,
            tag2:
            ''
            ,
            tag3:
            ''}
得到tages.tag1``````````````````
1.$inc
指对应字段相加减!!!!
比如
          
          
          
2.$mul是乘法
3.$rename修改字段名例如
           
            db
            .
            students
            .
            update
            ( 
            { 
            _id
            : 
            1 
            }, 
            { 
            $rename
            : 
            { 
            "nmae"
            : 
            "name" 
            } 
            } 
            )
还可以修改数组的字段加个点即可
4.如果没有$这些命令{key:'value'}会替换全部字段只留下update中的部分
5.$set 更新键值对
6.$unset删除字段
collection.
            update({}
            , {
            $unset: {tages:
            ''}}
            , {
            multi: 
            true})

7.$min更新比自己大的值比如
            $min
            : 
            { 
            lowScore
            : 
            150 
            }
            会更新比150大的值并且设值为150
            也可以比较日期
             
 
            $min
            : 
            { 
            dateEntered
            : 
            new 
            Date
            (
            "2013-09-25"
            ) 
            }
            
8.$max更新比自己小的值
9.3.0版 $currentDate(待更)

      

      

      

      
         
        {
         
        upsert
        :
         
        <
        boolean
        >
        ,
         //
        如果 
        upsert
         选项的值是 
        true
         且没有匹配到查询条件的文档, 
        update()
         方法会插入一条
        文档记录。update方法会这样插入一条新文档记录:如果想要避免插入多个同样的文档记录,query参数的字段中有唯一索引时只要true即可
        如果在没有一个name:Andy的字段下更新操作,一群人在处理同样操作
         
        db
        .
        people
        .
        update
        ( 
        { 
        name
        : 
        "Andy" 
        }, 
        { 
        name
        : 
        "Andy"
        , 
        rating
        : 
        1
        , 
        score
        : 
        1 
        }, 
        { 
        upsert
        : 
        true 
        } 
        )
为了阻止插入多条同样的文档记录,当upsert:true是只有一个update()操作可以成功插入一条新的文档记录其余的update会操作失败

      multi
      : 
      <
      boolean
      >
      ,//true为匹配到的所有数据都更改,false为匹配到的所有数据只更新一个默认false
 
      writeConcern
      : 
      <
      document
      > 
      } 
      )




db.collection.updateOne()  


      db
      .
      users
      .
      updateOne
      ( 
      {
 
      age
      : 
      { 
      $lt
      : 
      18 
      } 
      }, 
      { 
      $set
      : 
      { 
      status
      : 
      "reject" 
      } 
      } 
      )
等价于









和ORM模式下的mongoose一一对应映射命令

(不打算写~先把mongodb的语句熟悉了,mongoose是ORM模式感觉忙不过来~耦合性太大哈哈)


待更······


发表评论
评论通过审核后显示。