2016-04-22 20 views
2

So verwende ich pymongo==3.2.1 und Mongo 3.2 aber aus irgendeinem Grund funktioniert meine $addToSet (um Duplikate zu vermeiden) nicht.

ich sicher, dass meine checked_on Zeitstempel wie zum Beispiel angepasst ISODate("2016-04-21T00:00:00.000Z")

Meine Struktur ist wie folgt:

{ 
    "_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") 
} 

Ich habe versucht, beide:

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

und

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

Aber Duplikate tauchen immer auf, was mache ich falsch?

+1

Was erwarten Sie eigentlich? Punkt ist, dass die mit der Kombination von "checked_on" und "days", die beide der Eigenschaften in den Objekten in der "Menge" sind, wenn diese sich in irgendeiner Weise von etwas unterscheiden, das bereits dort ist, dann ist es tatsächlich ein " Neuer Gegenstand. Also entweder die "checked_on" oder "days" und möglicherweise sogar nur die "set" von "day" -Eigenschaften, die darin enthalten sind, würden eigentlich den "einzigartigen" Gegenstand bezeichnen. '$ AddToSet' kann das nicht verarbeiten, aber wenn Sie uns nicht genau sagen, was genau ein Element als einzigartig definiert, dann kann Ihnen auch niemand helfen. –

+0

@NeilLunn Ich bin mir nicht sicher, ob ich verstehe, was du meinst. all diese Elemente innerhalb der Verfügbarkeit müssen eindeutig zusammen sein – psychok7

Antwort

0

was mache ich falsch?

Sie machen nichts falsch. Dies liegt daran, dass der Wert, den Sie Ihrem Array hinzufügen möchten, ein Dokument ist. Dies ist nur das erwartete Ergebnis, wie in der documentation erwähnt.

Wenn der Wert ein Dokument ist, bestimmt MongoDB, dass das Dokument ein Duplikat ist, wenn ein vorhandenes Dokument im Array genau mit dem zu fügenden Dokument übereinstimmt. h. das existierende Dokument hat die exakt gleichen Felder und Werte und die Felder sind in der gleichen Reihenfolge. Daher kommt es auf die Reihenfolge der Felder an, und Sie können nicht festlegen, dass MongoDB nur eine Teilmenge der Felder im Dokument vergleicht, um zu ermitteln, ob das Dokument ein Duplikat eines vorhandenen Array-Elements ist.

+0

ich sehe, wie kann ich umgehen das Problem und vermeiden dulplicates mit Dokumenten? – psychok7

+0

Ich werde die Elemente manuell überprüfen, gibt es keinen besseren Weg, dies zu tun? – psychok7