这是我在python中使用pymongo的更新查询的一小部分。我想将$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,但使用带有JS的MongoDB的答案非常受欢迎。
编辑:很抱歉给您带来不便。
如果条件不满足,我希望能够更新其他字段事件。
self.db[coll_name].update_one(
{
'summary.userId': user_id
},
{'$push':
{
'summary.ip': ip
},
'$addToSet':
{
'summary.something_list': something
},
}
upsert=True
)
如果按照ip数组的长度进行过滤,如果ip list eq 9,我将不会添加something
,我必须这样做。
答案 0 :(得分:2)
在传递给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)
答案 1 :(得分:0)
var limit =10;
var query = {};
query["arrayName."+limit]={$exists:false}
model.update(query,{$push:{arrayName:value}})
我更喜欢的第二个选项是在模型中有一个长度字段,并分别在推或拉中增加或减少它({$ push:{arrayName:val},$ inc:{length:1}}或{$ pull :{arrayName:val},$ inc:{length:-1}})所以你可以简单地查询
model.update({length:{$lt:10}},{$push:{arrayName:value}})