从python

时间:2017-05-02 19:46:01

标签: python json mongodb

我有一个我要更新的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

在第一个if stetement如果计数它同样为零我正在用该特定用户创建json文件,而如果它已经存在那么我需要为Sla做同样的事情然后我需要更新db使用新的temp_json1和temp_json2。如何将子文档更新到我的初始文档中。实际上我想执行检查以查看db中是否有具有特定id的用户(否则我想添加他)然后如果当前item_id不存在则在用户文档中添加该项(就像我在我的代码已经)。最后,如果该项确实存在,那么我只想在已创建的子文档中添加temp_json1和temp_json2。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

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

您可以使用$elemMatch功能控制此查询,以通过Item子文档的123456子文档的process1数组的内容指定与查询匹配的内容。

查询的Mongo Shell格式如下(对于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”。

希望这有帮助!