服务器在pymongo上生成的ObjectID

时间:2014-06-08 23:30:47

标签: python mongodb pymongo

我正在使用pymongo(mongodb的python模块)。

我希望服务器自动创建ObjectID,但是当我们没有指定它时,它似乎是由pymongo自己创建的。

它引发的问题是我使用ObjectID按时间排序(仅通过_id字段排序)。但是它似乎正在使用每台计算机上设置的时间,因此我们无法真正依赖它。 关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:3)

如果您致电save并将其传递给没有_id字段的文档,则可以通过设置(神秘命名)来强制服务器添加_id而不是客户端manipulate的{​​{1}}选项:

False

答案 1 :(得分:1)

我不是Python用户,但我担心无法通过服务器生成_id。出于性能原因,_id总是由驱动程序生成,因此当您插入文档时,您不需要再执行其他查询来获取_id。

通过生成int序列_id,可以这样做,就像SqlServer的IDENTITY ID一样。要做到这一点,你需要在某个集合中保留一个记录,例如在我的项目中有一个seed,它只有一个记录:

{_id: ObjectId("..."), seqNo: 1 }

诀窍是,你必须使用findAndModify来保持查找并修改相同的"事务"。

var idSeed = db.seed.findAndModify({
    query: {},
    sort: {seqNo: 1},
    update: { $inc: { seqNo: 1 } },
    new: false
});
var id = idSeed.seqNo;

通过这种方式,您可以让所有实例获得唯一的序列#,您可以使用它来对记录进行排序。