189 8069 5689

MongoDB之数据更新(修改器)

对MongoDB数据库而言,数据的修改会牵扯到内容的变更,结构的变更(包含有数组)。所以在进行MongoDB设计的时候就提供有一系列修改器的应用。之前使用的“$set”就是一个修改器。

1、$inc:主要针对于一个数字字段,增加某个数字字段的数据内容:
语法:{"$inc":{"成员":"内容"}}
范例:将年龄为30岁的一个员工的薪水一律1000,年龄加1岁
> db.emp.update({"age":30},{"$inc":{"sal":-1000,"age":1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"age":31}).pretty();
{
        "_id" : ObjectId("599108423268c8e84253be26"),
        "name" : "赵一",
        "sex" : "男",
        "age" : 31,
        "sal" : 8999,
        "loc" : "北京"
}

2、$set:进行内容的重新设置:
语法:{"$set":{"成员":"新内容"}}
范例:将年龄是30岁的某个人员的薪水修改为7999
> db.emp.update({"age":30},{"$set":{"sal":7999}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"age":30}).pretty();
{
        "_id" : ObjectId("599108423268c8e84253be29"),
        "name" : "李四",
        "sex" : "女",
        "age" : 30,
        "sal" : 7999,
        "loc" : "北京"
}

3、$unset:删除某个成员的内容:
语法:{"$unset":{"成员":1}}
范例:删除“孙三”的年龄和薪水信息
> db.emp.find({"name":"孙三"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be28"),
        "name" : "孙三",
        "sex" : "男",
        "age" : 40,
        "sal" : 2000,
        "loc" : "深圳"
}
> db.emp.update({"name":"孙三"},{"$unset":{"age":1,"sal":1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"孙三"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be28"),
        "name" : "孙三",
        "sex" : "男",
        "loc" : "深圳"
}

4、$push:相当于将内容追加到指定的成员之中(基本上是数组):
语法:{"$push":{"成员":value}}
范例:向“孙三”添加2门课程信息(此时孙三信息下没有course信息)
> db.emp.update({"name":"孙三"},{"$push":{"course":["语文","数学"]}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"孙三"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be28"),
        "name" : "孙三",
        "sex" : "男",
        "loc" : "深圳",
        "course" : [
                [
                        "语文",
                        "数学"
                ]
        ]
}

范例:向“李四”添加一门课程信息(此时李四信息下没有course信息)
> db.emp.update({"name":"李四"},{"$push":{"course":"语文"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"李四"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be29"),
        "name" : "李四",
        "sex" : "女",
        "age" : 30,
        "sal" : 7999,
        "loc" : "北京",
        "course" : [
                "语文"
        ]
}

范例:向“刘A”的课程追加一个“美术”
> db.emp.find({"name":"刘A"}).pretty()
{
        "_id" : ObjectId("599129a00184ff511bf02b87"),
        "name" : "刘A",
        "sex" : "男",
        "age" : 35,
        "sal" : 8000,
        "loc" : "北京",
        "course" : [
                "语文",
                "数学",
                "英语",
                "音乐",
                "政治"
        ]
}
> db.emp.update({"name":"刘A"},{"$push":{"course":"美术"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"刘A"}).pretty()
{
        "_id" : ObjectId("599129a00184ff511bf02b87"),
        "name" : "刘A",
        "sex" : "男",
        "age" : 35,
        "sal" : 8000,
        "loc" : "北京",
        "course" : [
                "语文",
                "数学",
                "英语",
                "音乐",
                "政治",
                "美术"
        ]
}

就是进行数组数据的添加操作使用的。如果没有数组则进行新的数组的创建,如果有则进行内容的增加。

5、$pushAll:与“$push”是类似的,可以一次追加多个内容到数组里面:
语法:{"$pushAll":{"成员":数组内容}}
范例:向"周五"里面添加多个课程内容
> db.emp.find({"name":"周五"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be2a"),
        "name" : "周五",
        "sex" : "女",
        "age" : 30,
        "sal" : 9999,
        "loc" : "北京"
}
> db.emp.update({"name":"周五"},{"$pushAll":{"course":["美术","音乐"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"周五"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be2a"),
        "name" : "周五",
        "sex" : "女",
        "age" : 30,
        "sal" : 9999,
        "loc" : "北京",
        "course" : [
                "美术",
                "音乐"
        ]
}

6、$addToSet:向数组里面增加一个新的内容,只有这个内容不存在的时候才会增加
语法:{"$addToSet":{成员:内容}}
范例:向“周五”的信息增加新的内容
> db.emp.update({"name":"周五"},{"$addToSet":{"course":"舞蹈"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"周五"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be2a"),
        "name" : "周五",
        "sex" : "女",
        "age" : 30,
        "sal" : 9999,
        "loc" : "北京",
        "course" : [
                "美术",
                "音乐",
                "舞蹈"
        ]
}
此时会判断要增加的内容在数组里面是否存在,如果不存在则向数组之中追加内容,如果存在则不做任何修改操作。

7、$pop:删除数组内的数据
语法:{"$pop":{成员:内容}},内容如果设置为-1表示删除第一个,如果内容设置为1表示删除最后一个
范例:删除周五的第一个课程
> db.emp.update({"name":"周五"},{"$pop":{"course":-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"周五"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be2a"),
        "name" : "周五",
        "sex" : "女",
        "age" : 30,
        "sal" : 9999,
        "loc" : "北京",
        "course" : [
                "音乐",
                "舞蹈"
        ]
}

范例:删除周五的最后一个课程
> db.emp.update({"name":"周五"},{"$pop":{"course":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"周五"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be2a"),
        "name" : "周五",
        "sex" : "女",
        "age" : 30,
        "sal" : 9999,
        "loc" : "北京",
        "course" : [
                "音乐"
        ]
}

8、$pull:从数组内删除一个指定内容的数据
语法:{"$pull":{成员:数据}},进行数据比对的,如果是此数据是删除
范例:删除王五的音乐课程信息
> db.emp.update({"name":"周五"},{"$pull":{"course":"音乐"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"周五"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be2a"),
        "name" : "周五",
        "sex" : "女",
        "age" : 30,
        "sal" : 9999,
        "loc" : "北京",
        "course" : [ ]
}

9、$pullAll:一次性删除多个内容
语法:{"$pullAll":{成员:[数据,数据,...]}}
范例:删除“刘A”中的三门课程
> db.emp.find({"name":"刘A"}).pretty()
{
        "_id" : ObjectId("599129a00184ff511bf02b87"),
        "name" : "刘A",
        "sex" : "男",
        "age" : 35,
        "sal" : 8000,
        "loc" : "北京",
        "course" : [
                "语文",
                "数学",
                "英语",
                "音乐",
                "政治",
                "美术"
        ]
}
> db.emp.update({"name":"刘A"},{"$pullAll":{"course":["语文","数学","英语"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"name":"刘A"}).pretty()
{
        "_id" : ObjectId("599129a00184ff511bf02b87"),
        "name" : "刘A",
        "sex" : "男",
        "age" : 35,
        "sal" : 8000,
        "loc" : "北京",
        "course" : [
                "音乐",
                "政治",
                "美术"
        ]
}

10、$rename:为成员名称重命名
语法:{"$rename":{旧的成员名称:新的成员名称}}
范例:将“孙三”的name成员名称修改为“姓名”
> db.emp.find({"name":"孙三"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be28"),
        "name" : "孙三",
        "sex" : "男",
        "loc" : "深圳",
        "course" : [
                [
                        "语文",
                        "数学"
                ]
        ]
}
> db.emp.update({"name":"孙三"},{"$rename":{"name":"姓名"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.find({"姓名":"孙三"}).pretty()
{
        "_id" : ObjectId("599108423268c8e84253be28"),
        "sex" : "男",
        "loc" : "深圳",
        "course" : [
                [
                        "语文",
                        "数学"
                ]
        ],
        "姓名" : "孙三"
}

在整个MongoDB数据库里面,提供的修改器的支持很全面。
网页标题:MongoDB之数据更新(修改器)
当前网址:http://cdxtjz.cn/article/jcdsso.html

其他资讯