4

所以我正在使用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
        }
    }
)

但是重复出现,我做错了什么?

4

1 回答 1

1

我究竟做错了什么?

你没有做错任何事。这是因为您尝试添加到数组中的值是一个文档。这只是文档中提到的预期结果。

如果 value 是一个文档,如果数组中的现有文档与要添加的文档完全匹配,则 MongoDB 确定该文档是重复的;即现有文档具有完全相同的字段和值,并且字段的顺序相同。因此,字段顺序很重要,您不能指定 MongoDB 仅比较文档中字段的子集来确定文档是否是现有数组元素的副本。

于 2016-04-22T12:57:05.367 回答