Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyMongo$addToSet不工作_Python_Mongodb_Pymongo_Pymongo 3.x - Fatal编程技术网

Python PyMongo$addToSet不工作

Python PyMongo$addToSet不工作,python,mongodb,pymongo,pymongo-3.x,Python,Mongodb,Pymongo,Pymongo 3.x,因此,我使用的是pymongo==3.2.1和Mongo 3.2,但出于某种原因,我的$addToSet(避免重复)不起作用 我确保我的检查时间戳匹配,例如ISODate(“2016-04-21T00:00:00.000Z”) 我的结构是这样的: { "_id": ObjectID("57062e357e254255a531165e"), "availability": [ { "checked_on": ISODate("2016-04-

因此,我使用的是
pymongo==3.2.1
Mongo 3.2
,但出于某种原因,我的
$addToSet
(避免重复)不起作用

我确保我的
检查时间戳匹配,例如
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
        }
    }
)

但复制品不断出现,我做错了什么

我做错了什么

你没有做错什么。这是因为您试图添加到数组中的值是一个文档。这正是报告中提到的预期结果

如果该值为文档,则如果数组中的现有文档与要添加的文档完全匹配,MongoDB将确定该文档为重复文档;i、 e.现有文档具有完全相同的字段和值,并且字段顺序相同。因此,字段顺序很重要,您不能指定MongoDB仅比较文档中字段的子集,以确定文档是否与现有数组元素重复


我明白了,那么我怎样才能绕过这个问题,避免文档的重复呢?我要手动检查元素,难道没有更好的方法吗?那么,你到底希望发生什么呢?关键是,如果“集合”中对象的属性都是
checked_on
days
的组合,那么如果这些属性在任何方面“不同于”已有的属性,那么它实际上是一个“新”项。因此,在
或天上选中的
属性,甚至可能只是里面的
属性的“集合”,实际上表示“唯一”项。所以,
$addToSet
无法处理这个问题,但是除非你真的告诉我们是什么确切地定义了一个项目是唯一的,否则没有人能帮助你。@NeilLunn我不确定我是否理解你的意思。可用性中的所有这些元素必须是唯一的
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
        }
    }
)