2017-05-02 33 views
2

我有一個我想更新的mongodb數據庫。其實,我的創建和更新數據庫代碼如下:從python更新mongodb數據庫

from pymongo import MongoClient 
client = MongoClient() 
client = MongoClient('localhost', 27017) 
db = client['my_db_values'] 
res = collection = db['db_values'] 

res = collection.find({"User": "2145"}) 
if res.count() == 0: 
    json_file = {"User": "2145", "Item": {"123456": {"process1": [],"process2": []}}} 
    temp_json1 = {"timestamp": "2123532158", "process1_value": 0.4, "state": {"B": 0.1, "F": 0.2, "E": 0.3}} 
    temp_json2 = {"timestamp": "2323532158", "process2_value": 0.2, "P": 0.8} 
    json_file ["Item"][str(123464)]["process1"].append(temp_json1) 
    json_file ["Item"][str(123464)]["process2"].append(temp_json2) 
    temp = db.values 
    temp_id = temp.insert_one(json_file).inserted_id 
else: 
    for line in res: 
    counter = 0 
    for key in line["Item"].keys(): 
     if line["Item"].keys()[counter] == "123464": 
     collection.update_one({"User": "2145", "Item": {"123464": {"process1":[]}}}, {"$set": {"Item.123464.process2": [ 
     {"timestamp": "21354879546213", "process1_value": 0, 
     "state": {"B": 0.1, "F": 0.2, 
         "E": 0.3}}], "Item.123464.process2": [ 
     {"timestamp": "11354879546213", "process2_value": 0, "P": 0.8}]}}) 

     else: 
     collection.update_one({"User": "2145"},{"$set": {"Item.123464.process1": [{"timestamp": "21354879546213", "process1_value": 0.4, "state": {"B": 0.1, "F": 0.2, "E": 0.3}}], "Item.123464.process2": [{"timestamp": "11354879546213", "process2_value": 0.2, "P": 0.8}]}}) 
     counter = counter + 1 

在第一,如果stetement如果算上它同樣是零,我創建與特定用戶的JSON文件,如果它已經同時那麼我需要爲Sla做同樣的事情,然後我需要用新的temp_json1和temp_json2來更新數據庫。如何將子文檔更新到我的初始文檔中。其實我想執行一個檢查,看看是否有一個具有特定ID的用戶(否則我想添加他),然後如果當前的item_id不存在添加項目在用戶文檔中(如我在我的代碼已經)。最後,如果該項目確實存在,那麼我只想在已創建的子文檔中添加temp_json1和temp_json2。我該怎麼做?

回答

1

你想要的是子文檔查詢(通過它們的嵌套內容查詢文檔)。

您可以通過使用$elemMatch功能,指定什麼你Item子文檔的子文檔123456process1數組的內容您的查詢相匹配控制此查詢。

查詢的蒙戈殼牌格式如下(對於Python驅動程序只使用查詢部分):

db.your_collection.find({ 
    "User": "2145", 
    "Item.123456.process1": {$elemMatch: {$eq: "12345"} } 
}); 

所以,如果您的收藏中填充了以下2個文件:

{ "_id" : ObjectId("aaa"), "User" : "2145", "Item" : { "123456" : { "process1" : [ ], "process2" : [ ] } } }         
{ "_id" : ObjectId("bbb"), "User" : "2145", "Item" : { "123456" : { "process1" : [ "12345" ], "process2" : [ ] } } }  

此查詢將僅返回第二個文檔,但省略第一個文檔,因爲其process1數組內容不包含「12345」。

希望這會有所幫助!

+0

奧克大概我清楚。我最終想要的是,對於每個擁有不同密鑰的不同用戶來說,在頭文件「Item」中都有一個包含很多密鑰的文檔,我想在其中添加很多值。 –

+0

要回答您發生這種情況的次數的問題,您可以對此查詢運行計數。 要更新子文檔,請嘗試閱讀本文:https://www.nodechef.com/docs/cloud-search/updates-documents-nested-in-arrays – chinnychinchin

+0

我也可以插入子文檔嗎? –