2016-04-22 80 views
2

所以我使用pymongo==3.2.1Mongo 3.2但由於某種原因我的$addToSet(以避免重複)不起作用。

我確信我checked_on時間戳匹配例如像ISODate("2016-04-21T00:00:00.000Z")

我的結構是這樣的:

{ 
    "_id": ObjectID("57062e357e254255a531165e"), 
    "availability": [ 
     { 
      "checked_on": ISODate("2016-04-21T00:00:00.000Z"), 
      "days": [ 
       { 
        "available": false, 
        "day": ISODate("2016-04-29T00:00:00.000Z") 
       }, 
       { 
        "available": false, 
        "day": ISODate("2016-04-30T00:00:00.000Z") 
       } 
      ] 
     } 
    ], 
    "is_active": true, 
    "updated_on": ISODate("2016-04-21T13:41:12.449Z") 
} 

我曾經嘗試都:

result = self.db[self.collection_name].update_one(
    {'_id': doc['_id']}, 
    { 
     '$addToSet': { 
      'availability': { 
       '$each': [ 
        { 
         'checked_on': datetime.datetime(
          date.year, date.month, date.day 
         ), 
         'days': meta['availability'] 
        } 
       ] 
      } 
     }, 
     '$set': { 
      'is_active': is_active, 'updated_on': date 
     } 
    } 
) 

result = self.db[self.collection_name].update_one(
    {'_id': doc['_id']}, 
    { 
     '$addToSet': { 
      'availability': { 
       'checked_on': datetime.datetime(
        date.year, date.month, date.day 
       ), 
       'days': meta['availability'] 
      } 
     }, 
     '$set': { 
      'is_active': is_active, 'updated_on': date 
     } 
    } 
) 

但重複出現,我做錯了什麼?

+1

那麼你究竟期待什麼發生?要點在於,在「set」中的對象中具有「checked_on」和「days」的組合,如果這些「與」已經存在的內容「不同」,那麼它實際上是「新物品。所以無論是'checked_on'還是'days',甚至可能只是''day''屬性中的「set」,實際上都會表示這個「unique」項目。所以'$ addToSet'不能處理這個問題,但除非你真正告訴我們什麼東西確切地定義了一個項目是唯一的,否則沒有人能夠幫助你。 –

+0

@NeilLunn我不知道我明白你的意思。所有這些內部可用的元素必須是獨一無二的 – psychok7

回答

0

我做錯了什麼?

你沒有做錯任何事。這是因爲你試圖添加到數組中的值是一個文檔。這只是documentation中提到的預期結果。

如果該值是一個文檔,如果數組中的現有文檔與準確添加的文檔相匹配,則MongoDB確定該文檔是重複的;即現有文檔具有完全相同的字段和值,並且字段的順序相同。因此,字段順序很重要,您不能指定MongoDB只比較文檔中的一部分字段,以確定文檔是否與現有數組元素相同。

+0

我看,所以我怎麼能解決這個問題,避免與文件重複? – psychok7

+0

我要手動檢查元素,是不是有更好的方法來做到這一點? – psychok7