【问题标题】:PyMongo $addToSet not working [closed]PyMongo $addToSet 不工作 [关闭]
【发布时间】:2016-08-16 01:41:31
【问题描述】:

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

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

【问题讨论】:

  • 那么您到底期望发生什么?关键是 checked_ondays 的组合是“集合”中对象中的两个属性,如果这些“不同”与已经存在的东西有任何不同,那么它实际上是一个“新物品。因此,checked_ondays 甚至可能只是内部的 day 属性的“集合”实际上表示“唯一”项。所以$addToSet 无法处理这个问题,但除非你真的告诉我们是什么将一个项目定义为独一无二的,否则没有人可以帮助你。
  • @NeilLunn 我不确定我理解你的意思。可用性中的所有这些元素必须是唯一的

标签: python mongodb pymongo pymongo-3.x


【解决方案1】:

我做错了什么?

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

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

【讨论】:

  • 我明白了,那么我怎样才能解决这个问题并避免文档重复?
  • 我要手动检查元素,没有更好的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2013-02-04
  • 2014-05-04
  • 2016-04-26
  • 2012-10-08
相关资源
最近更新 更多