【问题标题】:Retrieve mongodb document by order number in collection通过集合中的订单号检索 mongodb 文档
【发布时间】:2020-09-30 20:33:39
【问题描述】:

我有一个看起来像这样的 mongodb 集合;

[
  {
    "Code": "018906",
    "X": "0.12",
  },
  {
    "Code": "018907",
    "X": "0.18",
  },
  {
    "Code": "018910",
    "X": "0.24",
  },
  {
    "Code": "018916",
    "X": "0.75",
  },
]

假设我想检索第三个文档的 Code 字段。我想使用类似retrieve_by_order(order_no=3, field='Code') 的python 函数,它将返回"018910"。 order_no 指向集合中的文档位置。

Code按升序排列。

我愿意使用任何 python mongodb 库。欢迎使用 pymongo、mongoengine 等 orm 的解决方案。

我使用的是python 3.7,mongodb v4.2

【问题讨论】:

    标签: python python-3.x mongodb pymongo mongoengine


    【解决方案1】:

    假设存储数据的顺序是正确的,使用 pymongo 的惰性解决方案将类似于:

    from pymongo import MongoClient
    
    client = MongoClient(<creds>)
    db = client.database
    coll = db.coll
    
    def retrieve_by_order(order_no, field="Code"):
        for i, post in enumerate(coll.find()):
             if i + 1 == order_no:
                 return post[field]
    

    更快一点的解决方案是让记录保存一个“order_no”字段,您可以直接查询它。

    示例:

    coll.find_one({"order_no": order_no})
    

    您可以将order_no设置为递增索引,可以使用以下代码设置:

    result = db.collection.create_index([('order_no', pymongo.ASCENDING)], unique=True)
    

    【讨论】:

    • 感谢您的回答。测试工作,虽然它有点慢。我想您建议使用 order_no 作为递增索引对于可接受的速度是必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2014-02-20
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多