MongoDB-$push if数组长度<;n、 同时更新一个

MongoDB-$push if数组长度<;n、 同时更新一个,mongodb,pymongo,Mongodb,Pymongo,这是我在python中使用pymongo进行更新查询的一小部分。我想$puship变量到一个数组中,只要它的长度小于10。我知道我可以先找到这个用户(find_one)并检查数组的长度来解决这个问题,但这不是一个有效的解决方案。如何使用mongo处理此问题 我读到,$cond只在聚合中起作用,所以我无法计算其他任何东西 我脚本的一部分: self.db[coll_name].update_one( { 'summary.userId':

这是我在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,但使用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字段的查询与更新其他字段的查询分开。是的,这是我能想到的最佳解决方案,但我想知道是否有更有效的方法。我只想对每个文档(这里的用户)执行一次更新。谢谢,我会更深入地了解它。谢谢,我会更深入地了解它。