我试图了解使用 PHP 和 mongodb 2.4.3 win32 的奇怪行为。我尝试让服务器端生成序列 ID。
当使用存储函数作为参数之一插入文档时,似乎每次插入都会调用存储函数多次。
假设我有一个这样初始化的计数器:
db.counters.insert( { _id: "uqid", seq: NumberLong(0) } );
我有一个名为 getUqid 的存储函数,定义为
db.system.js.save(
{ _id: "getUqid",
value: function () {
var ret = db.counters.findAndModify(
{ query: { _id: "uqid" },
update: { $inc: { seq: NumberLong(1) } },
new: true
} );
return ret.seq;
}
} );
当我像这样进行三个插入时:
$conn->test->ads->insert(['qid' => new MongoCode('getUqid()') , 'name' => "Sarah C."]);
我得到类似的东西:
db.ads.find()
{ "_id" : ObjectId("51a34f8bf0774cac03000000"), "qid" : 17, "name" : "Sarah C." }
{ "_id" : ObjectId("51a34f8bf0774cac03000001"), "qid" : 20, "name" : "Michel D." }
{ "_id" : ObjectId("51a34f8bf0774cac03000002"), "qid" : 23, "name" : "Robert U." }
任何线索为什么qid越来越多 3 ?这应该意味着我收到了三个对我存储函数的调用,对吗?
预先感谢您的帮助,问候。
PS:第二个问题:仍然需要 NumberLong 来确保我们在内部 mongodb 存储中有 64 位无符号整数?有什么命令可以在 shell 中进行交叉检查吗?