【问题标题】:Shift field values移位字段值
【发布时间】:2014-10-08 05:36:00
【问题描述】:

我有一份文件:

{
    "_id" : ObjectId("53ebc91c5b8bb46c9683b022"),
    "tagid" : "tag1",
    "location1" : "shelf1",
    "location2" : "shelf2",
    "location3" : "shelf3",
    "location4" : "shelf4",
    "location5" : "shelf5",
}

还有一个功能:

def myfunction():
    loc1 = {"location1": request.form.get('location')}
    query = {"tagid": request.form.get('tag')}
    tagid = handle.trackingdb.update(query,{"$set": loc1},**{'upsert':True})

如果 myfunction 获得一个新位置 (shelfz),我如何有效地将其插入 location1,同时将其他字段值向下移动,使其看起来像在下方,同时将字段保持在 5 个位置?

{
    "_id" : ObjectId("53ebc91c5b8bb46c9683b022"),
    "tagid" : "tag1",
    "location1" : "shelfz",
    "location2" : "shelf1",
    "location3" : "shelf2",
    "location4" : "shelf3",
    "location5" : "shelf4",
}

我目前的思路是:

query tagid
copy location4 to location5
copy location3 to location4
copy location2 to location3
copy location1 to location2
insert location1

但是我不确定如何用 PyMongo 表达这一点,或者它是否是完成任务的实用方法。

【问题讨论】:

  • 将所有五个值保留为字典键:值对绝对是错误的方法。你想要的是一个队列。 docs.python.org/2/library/collections.html#collections.deque
  • 或者在 MongoDB 术语中,这将是一个“数组”。字典/哈希/映射“键”存储“数据点”的东西是一种反模式。值是用来存储值而不是键的,请这样使用。
  • 感谢 cmets。尼尔,我不确定这是否会影响任何事情,但我相信价值观就是价值观。它们可以是除架子之外的任何位置,我需要能够查询键以检索值。

标签: python mongodb pymongo


【解决方案1】:

我想出了一个可能不是最优雅的解决方案,但它确实有效:

我的函数变成了:

def myfunction():
    location = request.form.get('location')
    query = {"tagid": request.form.get('tag')}
    #get document as dictionary:
    retrieve = handle.trackingdb.find_one(query)

    #function replaces values of specified keys in a dict:
    def replace_value(key_to_find, value):
        for key in retrieve.keys():
            if key == key_to_find:
                retrieve[key] = value

    #if the location has changed...:
    if location != retrieve.get("location1", ""):
        #shift all of the key values and insert the new one
        replace_value("location5", retrieve.get("location4", ""))
        replace_value("location4", retrieve.get("location3", ""))
        replace_value("location3", retrieve.get("location2", ""))
        replace_value("location2", retrieve.get("location1", ""))
        replace_value("location1", location)
        #update the document
        tagid = handle.trackingdb.update({},retrieve)

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多