2017-08-05 18 views
0

私はpymongoを使用してのmongo文書内の配列を更新しようとしているが、それは動作していない経由で作品を指令するが、robomongoに作品をして、同じクエリをコピーします。 更新はモンゴシェル経由ではなくpymongo

roboMongo(それは{'n': 1, 'nModified': 0, 'ok': 1.0, 'updatedExisting': True}返す):

db.my_collection.updateMany(
    {'start_time': 1501700400.0}, 
    {'$pull': {'related': {'$in': [{'KEY': '1', 'TYPE': 'my_type'}]}}}, 
    {upsert:true} 
) 

pymongoコード:

query_document = {'start_time': 1501700400.0} 
update_command = {'$pull': {'related': {'$in': [{'KEY': '1', 'TYPE': 'my_type'}]}}} 
_client[db][collection].update_many(query_document, update_command, True) 

文書:私は多分それが関連していると思ってい

{ 
    "_id" : ObjectId("598570c4ffd387293e368c8d"), 
    "related" : [ 
     { 
      "KEY" : "6", 
      "TYPE" : "my_type" 
     }, 
     { 
      "KEY" : "2", 
      "TYPE" : "my_type" 
     }, 
     { 
      "KEY" : "3", 
      "TYPE" : "my_type" 
     }, 
     { 
      "KEY" : "5", 
      "TYPE" : "my_type" 
     }, 
     { 
      "KEY" : "8", 
      "TYPE" : "my_type" 
     } 
    ], 
    "end_time" : 1501621200.0, 
    "start_time" : 1501700400.0 
} 

へ」と「 ?

アドバイスはありますか?

おかげ

+0

pymongoコールの結果はどうなりますか?それはエラーですか?またはそれはokを実行しますが、何も更新しませんか? – bagrat

+0

結果は次のとおりです。 '{ 'N':1、 'nModified':0、 'OK':1.0、 'updatedExisting':Trueの場合}' –

+1

だからクエリがドキュメントにマッチしますが、文書を変更しませんか?それは、 '$ KEY'と(' KEY ': "1"、... ')そこにない' related'の配列要素をしようとしているからですか?あなたがrobomongoでこれを行うと、正確に何が起こりますか?両方のクエリがドキュメントの全く同じバージョンで動作することは確かですか? – guessimtoolate

答えて

1

{'KEY': '1', 'TYPE': 'my_type'}は、したがって、私は実行して順序を強制する、注文する必要があります。

ordered_relateds = [] 
for ptr in ptrs_to_remove: 
    ordered_ptrs.append(collections.OrderedDict(sorted(related.items(), key=lambda t: t[0]))) 

update_command = {"$pull": {"related": {"$in": ordered_related}}} 

この方法のKEYはなかれハッシュの最初の要素になりますし、TYPEは、第1になります。

関連する問題