NoSQL学习笔记(四)文档类型、数组操作、删除文档


文档类型

例题

对于论坛帖子:(id, 标题,内容,创建时间,浏览次数,回复条数,跟帖(嵌套文档:[{用户名、回复内容、时间},......]))
插入语句:

db.posts.insertOne(
    {
        title:'mongodb真好',
        content:'mongodn真好',
        addtime:new Date(),
        username:'郑',
        pageviewnum:0,
        reviewnum:0,
    }
)

浏览不回复:
db.posts.updateOne(

{
    title:'mongodb真好'
},
{
    $inc:{
        pageviewnum:1
    }
}

);
回复title为“mongodb真好”的帖子

db.posts.updateOne(
    {
        title:'mongodb真好'
    },
    {
        $inc : {
            pageviewnum : 1,
            reviewnum : 1
        },
        $push : {
            reviewlogs : {
                uname : '小明',
                ucontent : '确实',
                uaddtime : new Date()
            }
        }
    }
)

数组操作

$pop

用于删除数组元素,仅限数组首尾。

  • $pop参数为-1:弹出第一个元素
  • $pop参数为:弹出最后一个元素

eg:删除“mongodb真好”帖子的第一条回复

db.posts.updateOne(
    {title:'mongodb真好'},
    {
        $pop : {
            reviewlogs : 1
        },
        $inc : {
            reviewnum : -1
        }
    }
)

$pullpullAll

用于删除数组匹配的元素

  • $pull:删除数组匹配的第一个元素
  • $pullAll:删除数组中多个匹配的子元素

eg1:删除'mongodb真好'帖子的1@126.com邮箱

db.posts.updateOne(
    {
        title:'mongodb真好'
    },
    {
        $pull : {
            emails : '1@126.com'
        }
    }
)

eg2:删除'mongodb真好'帖子的4@126.com5@126.com邮箱

db.posts.updateOne(
    {
        title:'mongodb真好'
    },
    {
        $pullAll : {
            emails : ['4@126.com','5@126.com']
        }
    }
)

$ 数组占位符

eg:将“mongodb真好”的帖子的“8@126.com”邮箱改成“81@126.com

db.posts.updateOne(
    {
        title:'mongodb真好',
        "emails.$":'8@126.com'
    },
    {
        $set : {
            "emails.$":'81@126.com'
        }
    }
)

数组占位符的使用注意事项

  • $符作为占位符只能占一层,不能占多层。
  • 必须使用引号标注被修改部分或修改结果("emails.$")。

删除文档

删除文档有两种方法:deleteOnedeleteMany

  • deleteOne:删除匹配查询条件的第一个文档
  • deleteMany:删除匹配查询条件的所有文档

两种方法都只包含查询条件一个部分。

eg:
对于集合:inventory:

db.inventory.insertMany( [
   { item: "journal", qty: 25, status: "A" },
   { item: "notebook", qty: 50, status: "P" },
   { item: "paper", qty: 100, status: "D" },
   { item: "planner", qty: 75, status: "D" },
   { item: "postcard", qty: 45, status: "A" },
] );

deleteOne

删除第一个status字段为D的文档:

db.inventory.deleteOne(
    {
        status:'D'
    }
)

会删除掉paper文档。

如果deleteOne不指定查询条件:

db.inventory.deleteOne(
    {}
)

会删除第一条文档。

deleteMany

删除所有status字段为A的文档:

db.inventory.deleteMany(
    {
        status:'A'
    }
)

会删除掉journal和postcard字段。
如果deleteMany不指定查询条件:

db.inventory.deletemany(
    {}
)

会删除集合中的所有文档。

save

仅包含一个文档。
当输入文档中不包括id时,执行插入操作。
插入的文档将创建_id。
eg1:

db.products.save(
    {
        item: "book", 
        qty: 40 
    }
)

文档中不包含id,所以执行插入操作。插入后会生成一个id值。
eg2:

db.products.save(
    {
        _id:100,
        item:'water',
        qty:30
    }
)

此时文档中包含id字段,save执行的操作等同于upsert:true时的update操作。

  • 当集合中不包含该id的文档时,插入上面的文档:

    { "_id" : 100, "item" : "water", "qty" : 30 }
  • 当集合中已含有该id的文档时,则更新该文档。
    如,有以下文档:

    { "_id" : 100, "item" : "water", "qty" : 30 }

    执行以下操作:

    db.products.save( { _id : 100, item : "juice" } )

    则文档更新为:

    { "_id" : 100, "item" : "juice" }

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - NoSQL学习笔记(四)文档类型、数组操作、删除文档


Make Everyday Count