如果这是重新发布的道歉,但我无法从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]
任何提示和建议都表示赞赏!
答案 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"
]
}