MongoDB之資料更新(修改器)

stonebox1122發表於2017-08-24
對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資料庫裡面,提供的修改器的支援很全面。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2144098/,如需轉載,請註明出處,否則將追究法律責任。

相關文章