mongodb 更新刪除內嵌list欄位值
阿新 • • 發佈:2018-12-24
# mongo建立連線
if replicaset_mongo:
self.client = MongoClient([host1_mongo, host2_mongo], replicaSet=replicaset_mongo, port=int(port_mongo))
self.client.admin.authenticate(user_mongo, passwd_mongo)
self.db = self.client['dm_bond']
else: # 連線mongo單機
self.client = MongoClient(host_mongo, int(port_mongo))
self.db = self.client['dm_bond']
if user_mongo != ' ': # (windows 執行)
self.db.authenticate(user_mongo, passwd_mongo, source=authenticate)
self.collection = self.db["bond_sentiment_bulletin" ]
self.collection.update_many(filter={"_id": doc['_id'], 'attach.srcUrlMd5': attach['srcUrlMd5']},
update={'$set': {'attach.$.updateTime': attach['UpdateTime']},'$unset': {'attach.$.UpdateTime': ''}})
mongodb update 重新命名列
db.getCollection('private_enterprise' ).find({})
查詢結果如下,現在需要把 “證券程式碼” =》 “code” ; “發行人中文名稱” =》 “COMP_NAME”
{
"_id" : ObjectId("594792ce10bba506b0e1cd26"),
"證券程式碼" : "011697006.IB",
"證券簡稱" : "16蘇沙鋼SCP009",
"發行人中文名稱" : "江蘇沙鋼集團有限公司"
}
/* 2 */
{
"_id" : ObjectId("594792ce10bba506b0e1cd27"),
"證券程式碼" : "011697010.IB",
"證券簡稱" : "16滬華信SCP006",
"發行人中文名稱" : "上海華信國際集團有限公司"
}
語句:
db.getCollection('private_enterprise').update({},{$rename:{"發行人中文名稱":'COMP_NAME'}},false,true)
db.getCollection('private_enterprise').update({},{$rename:{"證券程式碼":'code'}},false,true)
修改後結果:
{
"_id" : ObjectId("594792ce10bba506b0e1cd26"),
"證券簡稱" : "16蘇沙鋼SCP009",
"COMP_NAME" : "江蘇沙鋼集團有限公司",
"code" : "011697006.IB"
}
/* 2 */
{
"_id" : ObjectId("594792ce10bba506b0e1cd27"),
"證券簡稱" : "16滬華信SCP006",
"COMP_NAME" : "上海華信國際集團有限公司",
"code" : "011697010.IB"
}
引數說明:
- query : update的查詢條件,類似sql update查詢內where後面的。
- update : update的物件和一些更新的操作符(如inc…)等,也可以理解為sql update查詢內set後面的
- upsert : 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
- multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。
- writeConcern :可選,丟擲異常的級別。
Mongodb欄位更新$rename操作符
一、定義
$rename操作符更新欄位名有如下格式:
{$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
新的欄位名必須和已經存在的欄位名不一樣,使用點號去指定一個內嵌的文件的欄位;
考慮如下集合文件:
db.students.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' }
上面的操作重新命名nickname為alias、cell欄位名為mobile
二、規則
$rename操作符重新命名符合條件的文件欄位名;
如果文件已經存在一個欄位,$reanme操作符將會刪除掉這個欄位並且重新命名指定的欄位;
如果$rename操作符重新命名的欄位不存在那麼操作符什麼也不做;
對於內嵌文件欄位的重新命名$rename操作符的操作跟外部文件欄位是一樣的;
三、看如下的students集合文件
{
"_id": 1,
"alias": [ "The American Cincinnatus", "The American Fabius" ],
"mobile": "555-555-5555",
"nmae": { "first" : "george", "last" : "washington" }
}
{
"_id": 2,
"alias": [ "My dearest friend" ],
"mobile": "222-222-2222",
"nmae": { "first" : "abigail", "last" : "adams" }
}
{
"_id": 3,
"alias": [ "Amazing grace" ],
"mobile": "111-111-1111",
"nmae": { "first" : "grace", "last" : "hopper" }
}
重新命名欄位nmae為name:
db.students.updateMany( {}, { $rename: { "nmae": "name" } } )
重新命名後的結果是:
{
"_id": 1,
"alias": [ "The American Cincinnatus", "The American Fabius" ],
"mobile": "555-555-5555",
"name": { "first" : "george", "last" : "washington" }
}
{
"_id" : 2,
"alias" : [ "My dearest friend" ],
"mobile" : "222-222-2222",
"name" : { "first" : "abigail", "last" : "adams" }
}
{ "_id" : 3,
"alias" : [ "Amazing grace" ],
"mobile" : "111-111-1111",
"name" : { "first" : "grace", "last" : "hopper" } }
重新命名內嵌文件中的欄位:
重新命名一個內嵌文件欄位,呼叫$rename操作符使用點號引用欄位,如果重新命名的欄位是同一個內嵌文件中的欄位也使用點號引用,如下:
db.students.update( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )
上面的操作重新命名內嵌文件欄位first為fname
{
"_id" : 1,
"alias" : [ "The American Cincinnatus", "The American Fabius" ],
"mobile" : "555-555-5555",
"name" : { "fname" : "george", "last" : "washington" }
}
重新命名一個不存在的欄位:
當使用$rename操作符重新命名一個不存在的欄位時,操作符什麼也不做:
db.students.update( { _id: 1 }, { $rename: { 'wife': 'spouse' } } )
Mongodb刪除指定欄位
db.user.update({"email_state":{"$exists":true}},{"$unset":{"email_state",""}},{multi:true});
刪除user表的email_state欄位。
模版:
db.表.update({"field1":{"$exists":true}},{"$unset":{"field1",""}},{multi:true})
$exists:判斷存在該欄位。
注意在後面需要加上multi:true,刪除多行。