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 сравнивает только подмножество полей в документе, чтобы определить, является ли документ дубликатом существующего элемента массива.