【问题标题】:Inserting documents in MongoDB in specific order using pymongo使用 pymongo 按特定顺序在 MongoDB 中插入文档
【发布时间】:2018-04-06 14:01:21
【问题描述】:

我必须以左移方式在 MongoDB 中插入文档,即如果集合包含 60 个文档,我将删除第一个文档,并且我想在数据库的后面插入新文档。但是当我插入第 61 个元素等时,文档被插入到随机位置。 有什么方法可以按照我上面指定的顺序插入文档吗? 或者当我从数据库中检索值时是否必须进行此处理?如果是,那怎么办? 数据格式为:

data = {"time":"10:14:23", #timestamp 
         "stats":[<list of dictionaries>]
       } 

我使用的代码是

from pymongo import MongoClient
db = MongoClient().test
db.timestamp.delete_one({"_id":db.timestamp.find()[0]["_id"]})
db.timestamp.insert_one(new_data)

时间戳是集合的名称。

编辑:更改了代码。有没有更好的办法?

from pymongo.operations import InsertOne,DeleteOne

def save(collection,data,cap=60):
    if collection.count() == cap:
        top_doc_time= min(doc['time'] for doc in collection.find())
        collection.delete_one({'time':top_doc_time['_time']})
    collection.insert_one(data)

【问题讨论】:

    标签: python database mongodb pymongo


    【解决方案1】:

    批量写入操作guarantees query ordering by default。 这意味着查询是按顺序执行的。

    from pymongo.operations import DeleteOne, InsertOne
    
    
    def left_shift_insert(collection, doc, cap=60):
        ops = []
        variance = max((collection.count() + 1) - cap, 0)
        delete_ops = [DeleteOne({})] * variance
        ops.extend(delete_ops)
        ops.append(InsertOne(doc))
    
        return collection.bulk_write(ops)
    
    left_shift_insert(db.timestamp, new_data)
    

    【讨论】:

    • 这个解决方案没有像我希望的那样工作。你能给我一个替代解决方案吗?
    • 可能这也不起作用,因为删除后插入是以随机方式执行的。
    • 我在回答中链接到的 mongo 文档指出操作是默认排序的。我以 6 条记录的上限进行了尝试,并得到了正确的结果。你能提供一个我可以使用的样本吗?
    猜你喜欢
    • 2015-09-27
    • 2014-01-17
    • 1970-01-01
    • 2016-05-31
    • 2019-02-27
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多