2017-12-07 14 views
0

これはPythonでpymongoを使用した更新クエリの一部です。私は、$pushのip変数を配列の長さが10未満の場合にのみ変更したいと思います。この問題を最初に解決し、配列の長さをチェックすることはできますが効率的なソリューションではありません。どのように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リストのEQ 9、場合somethingを追加しません。

答えて

1

Collections.update_oneに渡されたフィルタでは、インデックスに9のIPインデックスが存在しない場所をフィルタリングできます。

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) 
+0

私の文書には2つの配列があり、チェックしたいと思っています。両方とも。私はあなたのソリューションがこのケースで動作する状況を想像することはできませんが、あなたは私の質問に答え、それは今のところ仕事をするでしょう。ありがとう。 さらに、len(array_1)> 10:が合格し、len(array_2)> 10:が合格であるかどうかをチェックしたかったので、そのうちの1つにのみ追加する場合があります。 –

+0

最初の配列と同じように、2番目の配列をフィルタに追加することができます –

+0

ご迷惑をおかけして申し訳ありませんが、私は質問を更新しました。私がIPでフィルターをかけると、残りの更新クエリを実行することができなくなります。さらに多くのことがあります。私の質問に例を追加しました。 –

0
var limit =10; 
var query = {}; 
query["arrayName."+limit]={$exists:false} 
model.update(query,{$push:{arrayName:value}}) 

私が好む第2のオプションは、モデルと増分の長さフィールドを持っているか、プッシュそれをデクリメントまたはそれぞれ({$プッシュプルすることである:{arrayName:valを}、$ INCを:{長さ:

model.update({length:{$lt:10}},{$push:{arrayName:value}}) 
+0

ありがとう、私はそれを深く見ていきます。 –

関連する問題