• MongoDB 内嵌文档


    MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子对象,而doc中的field可以是原子对象,也可以是内嵌doc(embedded doc),数组等数据类型。内嵌doc中所有field的Key不允许重复。

    例如以下doc,contact 字段是内嵌doc。

    oneDoc=
    {
    name:"t1",
    age:21,
    contact:
        {
            phone:123,
            email:"xx@microsoft.com"
        }
    }

    --Insert a doc
    db.foo.insert(OneDoc)

    一,查询内嵌文档
    1,如果内嵌doc存在field满足query filter,那么将doc返回。在引用内嵌doc中的field时,使用 dot notation,格式是:embedded_doc.field:value,如果内嵌doc的field也是内嵌文档,依次类推,embedded_doc1.embedded_doc2.field:value。

    示例,查询contact 字段中phone是123的所有doc。

     db.foo.find({"contact.phone":123})

    2,限制返回的doc的field
    示例,使用find的第二个参数Projection doc,只返回两个field:name 字段和内嵌doc的email字段。通过dot notation,将内嵌doc中的某些字段返回,格式是:embedded_doc.field:1,表示返回该字段,embedded_doc.field:0,表示不返回该字段。

    db.foo.find({"contact.phone":123},{_id:0,"contact.email":1,name:1})

    二,修改内嵌doc

    upsert 选项非常有用,如果当前的doc中不存在内嵌文档,通过$set modifier 来增加;如果当前的doc中存在内嵌文档,通过$set modifier来修改内嵌文档的值。

    1,修改doc,增加内嵌doc

    示例,增加address字段,这是内嵌doc

    db.foo.updateMany(
    {name:"t1"},
    {$set:{address:{province:"henan",city:"xinyang"}}},
    {upsert:true}
    )

    2,修改内嵌doc中的字段
    示例,修改内嵌doc中province 和 city 字段的内容,全部修改为"shanghai"

    db.foo.updateMany(
    {name:"t1"},
    {$set:{address:{province:"shanghai",city:"shanghai"}}},
    {upsert:true}
    )

    三,删除doc中的内嵌doc
    $unset modifier能够删除doc中的字段,使用格式:{$unset:{field1:"", field2:""}},将删除的字段放在$unset文档中。

    1,如果要删除内嵌doc中的field或数组中的元素,可以使用dot notation。

    示例,删除address内嵌doc中的province 字段

    db.foo.updateMany(
    {name:"t1"},
    {$unset:{"address.province":""}},
    {upsert:true}
    )

    2,如果不使用dot notation,那么删除的将是整个内嵌doc

    示例,在$unset modifier中,使用address 内嵌doc 格式,那么将删除address field。

    db.foo.updateMany(
    {name:"t1"},
    {$unset:{address:{province:"shanghai"}}},
    {upsert:true}
    )

    引用doc:

    $set

    $unset

  • 相关阅读:
    Java 对象和类
    Java main方法解释
    Android点击EditText文本框之外任何地方隐藏键盘的解决办法
    页面跳转回来之后,网络请求自动刷新
    《买红薯的故事》醍醐灌顶,警钟长鸣。
    字符串比较器,例如按照时间的升序降序,或者姓氏排序
    android中用Intent传数据,如果用传递的是一个类,就将类实现Parcelable接口
    view在使用shape属性加圆角的同时,用代码修改其他background属性(例如颜色)不生效
    android基础学习之布局
    详解安卓项目-闹钟
  • 原文地址:https://www.cnblogs.com/ljhdo/p/5042931.html
Copyright © 2020-2023  润新知