从python更新mongodb数据库

问题描述:

我有一个我想更新的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。我该怎么做?

你想要的是子文档查询(通过它们的嵌套内容查询文档)。

您可以通过使用$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

我也可以插入子文档吗? –