mongodb update array

来源:互联网 发布:windows 媒体播放器 编辑:程序博客网 时间:2024/06/05 08:14

之前一篇介绍了update的基本操作,今天介绍涉及更深一些的操作,数组操作以及一些函数的使用

$inc 对指定的字段增加值,只能操作数值类型 语法:{ $inc : { field : value } }给field增加value

$set 这个相当于SQL的set操作,指定某个字段的值,可以操作所有类型

$unset  语法:{ $unset : { field : 1} } 删除某一个字段
$push 语法:{ $push : { field : value } }  如果field存在,那么valuse追加到field,field一定要是一个数组,不存在,那么新增这个field

$pushAll 同上,只是这里可以追加的value是数组

$addToSet 语法:{ $addToSet : { field : value } } 如果field存在,并且value不在其中,那么把value加到数组,如果不存在field,把value赋值给field,这里操作的也是数组

$pop  语法:{ $pop : { field : 1 } }和{ $pop : { field : -1 } } 分别是删除最后一个元素和第一个元素

$pull 语法:$pull : { field : value } } 从field删除等于value的元素

$pullAll 语法:{ $pullAll : { field : value_array } } 意思同$pull,但是可以删除多个值

$rename 语法:{ $rename : { old_field_name : new_field_name } 重命名字段名

另外介绍一个$操作符,加上这个操作符,只会应用匹配第一条,后面的不再操作,另外和$unset操作的时候不是删除了,而是会留下一个null值,如果要删除null的记录,可以使用{$pull:{x:null}}

下面举例演示:

PRIMARY> db.test.find()
{ "_id" : ObjectId("50c1872fe2e3192b739d44e7"), "id" : 1, "name" : "hank", "scores" : 80 }
PRIMARY> db.test.update({id:1},{$inc:{scores:5}});                     --$inc使用
PRIMARY> db.test.find()
{ "_id" : ObjectId("50c1872fe2e3192b739d44e7"), "id" : 1, "name" : "hank", "scores" : 85 }
PRIMARY> db.test.update({id:1},{$set:{scores:60}});                  --$set使用
PRIMARY> db.test.find()
{ "_id" : ObjectId("50c1872fe2e3192b739d44e7"), "id" : 1, "name" : "hank", "scores" : 60 }
PRIMARY> db.test.update({id:1},{$unset:{scores:60}});              --$unset使用
PRIMARY>  db.test.find()
{ "_id" : ObjectId("50c1872fe2e3192b739d44e7"), "id" : 1, "name" : "hank" }

上面几个操作可以是数组里面的操作

PRIMARY> db.test.findOne()
{
        "_id" : 1,
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "4",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20111224000000",
                        "expTime" : "20120123235959"
                },
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                }
        ]
}

PRIMARY> db.test.update({ "usrDiscountBCList.usrContentId":"4"},{$push:{"usrDiscountBCList":"joe"}})    --$push使用
PRIMARY> db.test.findOne()
{
        "_id" : 1,
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "4",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20111224000000",
                        "expTime" : "20120123235959"
                },
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                },
                "joe"
        ]
}

db.test.update({ "usrDiscountBCList.usrContentId":"4"},{$pushAll:{"usrDiscountBCList":[{name:"joe",scores:90}]}})  --$pushAll使用
db.test.findOne()
{
        "_id" : 1,
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "4",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20111224000000",
                        "expTime" : "20120123235959"
                },
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                },
                "joe",
                {
                        "name" : "joe",
                        "scores" : 90
                }
        ]
}

db.test.update({ "usrDiscountBCList.usrContentId":"4"},{$addToSet:{"usrDiscountBCList":[{name:"joe",scores:90}]}})--$addToSet使用
db.test.findOne()
{
        "_id" : 1,
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "4",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20111224000000",
                        "expTime" : "20120123235959"
                },
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                },
                "joe",
                {
                        "name" : "joe",
                        "scores" : 90
                },
                [
                        {
                                "name" : "joe",
                                "scores" : 90
                        }
                ]
        ]
}

这里如果重复执行以上语句,那么不会再有操作,和原来是一致的,因为$addToSet如果存在,那么不做操作,不存在有相关字段那么添加

PRIMARY> db.test.update({ "usrDiscountBCList.usrContentId":"4"},{$addToSet:{"myfied":[{name:"joe",scores:90}]}})
PRIMARY>  db.test.findOne()
{
        "_id" : 1,
        "myfied" : [
                [
                        {
                                "name" : "joe",
                                "scores" : 90
                        }
                ]
        ],
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "4",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20111224000000",
                        "expTime" : "20120123235959"
                },
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                },
                "joe",
                {
                        "name" : "joe",
                        "scores" : 90
                },
                [
                        {
                                "name" : "joe",
                                "scores" : 90
                        }
                ]
        ]
}

PRIMARY> db.test.update({ "usrDiscountBCList.usrContentId":"4"},{$pop:{"usrDiscountBCList":1}})   --$pop使用 删除最后一个
PRIMARY> db.test.findOne()
{
        "_id" : 1,
        "myfied" : [
                [
                        {
                                "name" : "joe",
                                "scores" : 90
                        }
                ]
        ],
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "4",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20111224000000",
                        "expTime" : "20120123235959"
                },
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                },
                "joe",
                {
                        "name" : "joe",
                        "scores" : 90
                }
        ]
}

PRIMARY> db.test.update({ "usrDiscountBCList.usrContentId":"4"},{$pop:{"usrDiscountBCList":-1}})   --$pop 删除满足条件第一个元素
PRIMARY> db.test.findOne()
{
        "_id" : 1,
        "myfied" : [
                [
                        {
                                "name" : "joe",
                                "scores" : 90
                        }
                ]
        ],
        "skyImsi" : "aaaaaaaaaaaaaaaaaaaaaa",
        "usrComboVer" : "bbbbbbbbbbbbbb",
        "usrDiscountBCList" : [
                {
                        "usrContentId" : "5",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120124000000",
                        "expTime" : "20120223235959"
                },
                {
                        "usrContentId" : "6",
                        "sourceType" : 1,
                        "sourceId" : 1,
                        "contentId" : "1",
                        "billingType" : 1,
                        "billingTypeValue" : 0,
                        "billingCol0" : 0,
                        "effTime" : "20120224000000",
                        "expTime" : "20120325235959"
                },
                "joe",
                {
                        "name" : "joe",
                        "scores" : 90
                }
        ]

}