MongoDB - $ push如果数组长度< n,而update_one

时间:2017-12-07 10:12:05

标签: mongodb pymongo

这是我在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,我必须这样做。

2 个答案:

答案 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}})