插入新文档或修改现有文档

时间:2016-01-30 16:15:12

标签: mongodb mono pymongo

如果这是重新发布的道歉,但我无法从mongodb文档示例中获得我想要的查询。

这是我的问题。我无法在单个查询中执行更新现有文档的array_field或添加新文档并使用初始值初始化array_field。

我可以将findOne()与一些条件逻辑一起使用,并且可能解决这个问题,但我认为mongodb有这个用例的实现

到目前为止,这是代码:

#data_json = JSON document to be added to collection

collection.update_one({"json_id":data_json["json_id"], "_dashbd_id_":dashboard_id},{{"$addToSet": {"array_field":keyword}},{"$setOnInsert":data_json}}, upsert=True)

我正在查询json_id和我的收藏中的_dashbd_id_。如果它存在,那么我打算将“keyword”添加到array_field。如果它不存在,请创建一个新文档data_json,其中包括array_field = [keyword]

任何提示和建议都表示赞赏!

2 个答案:

答案 0 :(得分:5)

如果我理解正确,您只想更新数据库中的值(如果它们不存在)以及创建包含数组的新文档。好的,在mongodb中有一种方法,我将在本回复中提及。我认为你应该先了解一些可以帮助你获得类似结果的命令(再次有一种简单的方法可以阅读)

让我先从第一部分开始:

更新数组中的元素,您将点符号用于索引示例:

db.collection_name.update({"_id": id}, {'$set': {"array_name.indexNumber": value}})

说我们在集合名称​​ cars

中有以下文档
db.cars.findOne():
{
 _id: 1
 name: EvolutionX
 brand: Mitsubish
 year: 2012
 mods: [ turbo, headlights ] 
}

在上面的示例中,我们想要使用 backlights 更新 headlights ,我们执行以下操作(使用mongoshell,您可以删除键名称中的引号,当使用数组索引时:)

db.cars.update({id:1}, {$set:{"mods.1":"rearlights"}})

1 是车灯的索引。

注意小心这里,如果您没有在数组中使用索引,如

db.cars.update({id:1}, {$set:{"mods":"rearlights"}})

这将覆盖现有文档 _id:1 ,它将丢失文档中的所有其他属性或字段,因此会产生以下结果:

db.cars.findOne():
{
 _id: 1
 mods: [ rearlights ] 
}

现在,假设我们要将元素轮胎添加到 mods 数组,您可以使用 $ push

db.collection_name.update({"_id": id}, {'$push': {"array_name": value}})

所以它将是

db.cars.update({"_id":1}, {"$push":{"mods":"tires"}})

现在说要删除“ headlights ”而不是更新 mods 数组。在这种情况下,您使用 $ pop

db.cars.update({"_id":1}, {"$pop":{"mods":"headlights"}})

现在考虑到这一点。 简单方法:仅在元素不存在的情况下才能添加到mongodb中,您可以使用 $ addToSet 。我喜欢这个运算符,因为如果元素不存在,它只会添加到数组中。以下是如何使用它:

db.cars.update({"_id":1}, {"$addToSet":{"mods":"headlights"}})

现在如果 headlights 在数组中,它将不会被添加,否则它将被添加到数组的末尾。

好的,这是问题的第一部分。第二部分是用数组初始化文档。好的,这里有两个想法:第一个是你没必要的。使用 addToSet ,您可以创建数组(如果它不存在)(假设 _id 2 存在,但没有 mods 阵列):

db.cars.update({"_id":2}, {"$addToSet":{"mods":"bonnet"}})

如果文档 _id:2存在,这将创建数组。假设 _id:3 不存在,您将插入名为 upsert 的第三个属性

db.cars.update({"_id":3}, {"$addToSet":{"mods":"headlights"}}, {upsert:true})

这将创建第三个文档,其中包含数组 mods ,其中包含 headlights _id:3 。请注意,没有其他属性只会添加 _id mods 数组

第二个想法是当你插入一个新的文档时,你用空的 mods 数组插入它作为 mod:[] 我希望有帮助

答案 1 :(得分:1)

假设您的data_json,dashboard_id和关键字包含以下详细信息。

   dashboard_id = ObjectId("5423200e6694ce357ad2a1ac")
   keyword = "testingKeyword"
   data_json = 
   {  
           "json_id":ObjectId("5423200e6694ce357ad2a1ac"),   
           "item":"EFG222",  
           "reorder":false,  
   }

如果您执行以下查询

db.collection_name.update({"json_id":data_json["json_id"], "_dashbd_id_":dashboard_id},{{"$addToSet": {"array_field":keyword}},{ upsert=True}) 

如果文档存在,它会将关键字推送到array_field,或者它将插入具有以下详细信息的新文档。

     {  
           "_id":ObjectId("5sdvsdv6sdv694ce357ad2a1ac"),
           "json_id":ObjectId("5423200e6694ce357ad2a1ac"),
           "dashboard_id": ObjectId("sddfb6694ce357ad2a1ac")
           "item":"EFG222",  
           "reorder":false,  
           "array_field":
              [                    
              "testingKeyword"
           ]
 }