PyMongo $addToSet не работает

Так что я использую pymongo==3.2.1 а также Mongo 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 ответ

Что я делаю неправильно?

Вы не делаете ничего плохого. Это потому, что значение, которое вы пытаетесь добавить в свой массив, является документом. Это просто ожидаемый результат, как указано в документации.

Если значение является документом, MongoDB определяет, что документ является дубликатом, если существующий документ в массиве точно соответствует документу, который будет добавлен; т.е. существующий документ имеет точно такие же поля и значения, и поля находятся в том же порядке. Таким образом, порядок полей имеет значение, и вы не можете указать, что MongoDB сравнивает только подмножество полей в документе, чтобы определить, является ли документ дубликатом существующего элемента массива.

Другие вопросы по тегам