MongoDB-$push if数组长度<;n、 同时更新一个
这是我在python中使用pymongo进行更新查询的一小部分。我想MongoDB-$push if数组长度<;n、 同时更新一个,mongodb,pymongo,Mongodb,Pymongo,这是我在python中使用pymongo进行更新查询的一小部分。我想$puship变量到一个数组中,只要它的长度小于10。我知道我可以先找到这个用户(find_one)并检查数组的长度来解决这个问题,但这不是一个有效的解决方案。如何使用mongo处理此问题 我读到,$cond只在聚合中起作用,所以我无法计算其他任何东西 我脚本的一部分: self.db[coll_name].update_one( { 'summary.userId':
$push
ip变量到一个数组中,只要它的长度小于10。我知道我可以先找到这个用户(find_one
)并检查数组的长度来解决这个问题,但这不是一个有效的解决方案。如何使用mongo处理此问题
我读到,$cond
只在聚合中起作用,所以我无法计算其他任何东西
我脚本的一部分:
self.db[coll_name].update_one(
{
'summary.userId': user_id
},
{'$push':
{
'summary.ip': ip
},
}
upsert=True
)
我的大脑想做什么:
self.db[coll_name].update_one(
{
'summary.userId': user_id
},
{
"$cond": {"if": {"$size": {"$summary.ip": {"$ne": 10}}},
"then": {"$push": ip},
"else": pass
}},
upsert=True
)
我试图将自己局限于pymongo,但使用MongoDB和JS的答案非常受欢迎
编辑:很抱歉给您带来不便
如果不满足条件,我希望能够更新其他字段事件
self.db[coll_name].update_one(
{
'summary.userId': user_id
},
{'$push':
{
'summary.ip': ip
},
'$addToSet':
{
'summary.something_list': something
},
}
upsert=True
)
如果我按ip数组的长度进行筛选,我不会在ip列表eq 9中添加
内容,这是我必须做的。在传递给集合的筛选器中。更新一个,您可以在集合中不存在ip索引9的地方进行筛选
filter_ = {
'summary.userId': user_id,
'summary.ip.9': {
'$exists': False
}
}
update = {
'$push': {
'summary.ip': ip
}
}
self.db[coll_name].update_one(filter_, update, upsert=True)
在传递给Collections.update_one
的筛选器中,可以在集合中不存在ip索引9的情况下进行筛选
filter_ = {
'summary.userId': user_id,
'summary.ip.9': {
'$exists': False
}
}
update = {
'$push': {
'summary.ip': ip
}
}
self.db[coll_name].update_one(filter_, update, upsert=True)
我更喜欢的第二个选项是在模型中有一个长度字段,并在push或pull中分别递增或递减它({$push:{arrayName:val},$inc:{length:1}}或{$pull:{arrayName:val},$inc:{length:-1}),这样您就可以像
model.update({length:{$lt:10}},{$push:{arrayName:value}})
我更喜欢的第二个选项是在模型中有一个长度字段,并在push或pull中分别递增或递减它({$push:{arrayName:val},$inc:{length:1}}或{$pull:{arrayName:val},$inc:{length:-1}),这样您就可以像
model.update({length:{$lt:10}},{$push:{arrayName:value}})
我的文档中有两个数组,我想检查它们。我无法想象你的解决方案在这种情况下会起作用,但你回答了我的问题,现在就可以了。谢谢另外,我想检查len(array_1)>10:pass和len(array_2)>10:pass,因此我只向其中一个添加。您可以像第一个一样将第二个数组添加到过滤器中抱歉,给您带来不便,我更新了我的问题。如果我按ip过滤,我将无法执行更新查询的其余部分,而且还有很多。为我的问题添加了一个示例。您可能希望将更新ip字段的查询与更新其他字段的查询分开。是的,这是我能想到的最佳解决方案,但我想知道是否有更有效的方法。我只想对每个文档(这里有一个用户)执行一次更新。我的文档中有两个数组,我想检查这两个数组。我无法想象你的解决方案在这种情况下会起作用,但你回答了我的问题,现在就可以了。谢谢另外,我想检查len(array_1)>10:pass和len(array_2)>10:pass,因此我只向其中一个添加。您可以像第一个一样将第二个数组添加到过滤器中抱歉,给您带来不便,我更新了我的问题。如果我按ip过滤,我将无法执行更新查询的其余部分,而且还有很多。为我的问题添加了一个示例。您可能希望将更新ip字段的查询与更新其他字段的查询分开。是的,这是我能想到的最佳解决方案,但我想知道是否有更有效的方法。我只想对每个文档(这里的用户)执行一次更新。谢谢,我会更深入地了解它。谢谢,我会更深入地了解它。