【问题标题】:pymongo $set on array of subdocumentspymongo $set 在子文档数组上
【发布时间】:2016-03-31 08:55:41
【问题描述】:

我有一个 pymongo 集合,格式如下:

{
    "_id" : "R_123456789",
    "supplier_ids" : [
        {
                "id" : "S_987654321",
                "file_version" : ISODate("2016-03-15T00:00:00Z"),
                "latest" : false
        },
        {
                "id" : "S_101010101",
                "file_version" : ISODate("2016-03-29T00:00:00Z"),
                "latest" : true
        }
    ]
}

当我获得新的供应商数据时,如果供应商 ID 已更改,我想通过将上一个 'latest' 上的 latest 设置为 False 并 $push 新记录来捕获它。

$set 无法正常工作,因为我正在尝试使用它('else' 之后的注释代码):

import pymongo
from dateutil.parser import parse

new_id = 'S_323232323'
new_date = parse('20160331')

with pymongo.MongoClient() as client:
    db = client.transactions
    collection_ids = db.ids

    try:
        collection_ids.insert_one({"_id": "R_123456789",
                                   "supplier_ids": ({"id": "S_987654321",
                                                     "file_version": parse('20160315'),
                                                     "latest": False},
                                                    {"id": "S_101010101",
                                                     "file_version": parse('20160329'),
                                                     "latest": True})})
    except pymongo.errors.DuplicateKeyError:
        print('record already exists')

    record = collection_ids.find_one({'_id':'R_123456789'})

    for supplier_id in record['supplier_ids']:
        print(supplier_id)
        if supplier_id['latest']:
            print(supplier_id['id'], 'is the latest')

            if supplier_id['id'] == new_id:
                print(new_id, ' is already the latest version')
            else:
                # print('setting', supplier_id['id'], 'latest flag to False')
                # <<< THIS FAILS >>>
                # collection_ids.update_one({'_id':record['_id']},
                #                           {'$set':{'supplier_ids.latest':False}})
                print('appending', new_id)
                data_to_append = {"id" : new_id,
                                  "file_version": new_date,
                                  "latest": True}
                collection_ids.update_one({'_id':record['_id']},
                                          {'$push':{'supplier_ids':data_to_append}})

非常感谢任何和所有帮助。

整个过程看起来异常冗长 - 我应该使用更精简的方法吗?

谢谢!

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    您可以尝试使用位置运算符。

    collection_ids.update_one(
        {'_id':record['_id'], "supplier_ids.latest": true},
        {'$set':{'supplier_ids.$.latest': false}}
    )
    

    此查询将更新supplier_ids.latest = false,如果它在文档中为真并且匹配其他条件。

    问题是您还必须将字段数组作为条件的一部分。

    欲了解更多信息,请参阅Update

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2014-10-24
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2020-09-08
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多