【问题标题】:Trouble querying mongo _id that is a document containing a Date查询包含日期的文档的 mongo _id 时遇到问题
【发布时间】:2019-02-19 21:18:04
【问题描述】:

我有一个 mongo 集合,其中 _id 值是看起来像这样的文档:

{
    "_id" :
        {
            "day" : ISODate("2019-02-19T00:00:00Z"),
            "shift_id" : 3,
            "venue_id" : 12345
        }
}

由于 ISODate 值,我无法查询。特别是,当我使用 upsert: true 执行 replaceOne 时,我得到一个错误:

pymongo.errors.WriteError: After applying the update, the (immutable) field '_id' was found to have been altered to _id: { venue_id: 12346, shift_id: 13, day: new Date(1551052800000) }

在我看来问题在于 Date 对象彼此不相等,但我不确定我应该做些什么来帮助解决这个问题。

我总是使用 python 的 datetime.datetime(2019, 2, 19) 在我的 _id 中生成这些日期。

key = {
        'venue_id': 12345,
        'shift_id': 3,
        'day': datetime.datetime(2019, 2, 19)
}
document['_id'] = key
collection.replace_one(
    {'_id': key},
    document,
    upsert=True
)

【问题讨论】:

  • 当您将 new Date(1551052800000) 解析为 ISODate 时,它​​会返回 ISODate("2019-02-25T00:00:00Z")(而不是 ISODate("2019-02-19T00:00:00Z"))。也许仔细检查分配 key 值的代码,以确保它产生了您期望的结果。

标签: python mongodb pymongo


【解决方案1】:

任何文档中的对象 ID 都是在首次创建时分配的,它是 immutable,因此您无法更新它。要更改对象 ID,您必须插入具有更改 ID 的新文档,然后他们删除旧文档。如果您不希望用户同时查看旧文档和新文档,请在 transaction 中插入和删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2018-10-06
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多