Php MongoDB-如何使用自动增量功能插入记录

Php MongoDB-如何使用自动增量功能插入记录,php,mongodb,Php,Mongodb,我正在跟踪这里找到的文档 我有两个计数器,一个叫做locationid,另一个叫做playhistid。 这就是它们的样子: { "_id" : "locationid", "seq" : 0 } { "_id" : "playhistid", "seq" : 0 } 我还创建了以下函数: function getNextSequence(name) { var ret = db.counters.findAndModify( {

我正在跟踪这里找到的文档

我有两个计数器,一个叫做locationid,另一个叫做playhistid。 这就是它们的样子:

{
    "_id" : "locationid",
    "seq" : 0
}

{
    "_id" : "playhistid",
    "seq" : 0
}
我还创建了以下函数:

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );
现在我需要一种从PHP调用
getNextSequence(“locationid”)
的方法。
到目前为止,我的代码是这样的:

function add_playbook_history_record($location)
{
        $m = new MongoClient("mongodb://10.1.1.111:27017");
        $db = $m->testdb;
        $collection = $db->testcollection;
        $cursor = $collection->insert($location);
}
如您所见,我没有调用getNextSequence()函数,因为我不知道如何在中执行此操作。我在这个网站上发现了一个类似的问题:

但是。。。它们实际上并没有展示如何在PHP中实现这一点。他们只是展示mongo文档中的材料

编辑1

我想的是尝试找到一种使用db->command()方法运行getNextSequence()的方法。。。然后向我的$location数组添加一个新项,如下所示:

$location["_id"] = value_from_db_command; 

您需要在$location中添加_id字段。 而且_id必须是您的inc id。 例如:

我的建议是:在FindModify中添加upsert

它对您有用:

    function getNextSequence($name)
    {
        $m = new MongoClient("mongodb://10.1.1.111:27017"); // In a real project, you do not need all the time to re-create the connection
        $db = $m->testdb;
        $collection = $db->counters;
        $result =  $collection->findAndModify(
            ['_id' => $name],
            ['$inc' => ['seq' => 1]],
            ['seq' => true],
            ['new' => true, 'upsert' => true]
        );
        if (isset($result['seq']))
        {
            return $result['seq'];
        }
        else
        {
            return false;
        }
    }
在实际项目中,您不需要一直重新创建连接

您可以创建MongoDatabase(此模式为Singleton)

和调用需要方法

MongoDatabase::getInstance()->selectCollection('counters')->findAndModify(...)

我们有可能获得最大id表单集合

db->collection->find()->sort(array('id' => -1))->limit(1)
它返回最大id数组。添加
db['id']+1


每次都不需要在mongo中存储自动增量id

您能解释一下upsert的用途吗?另外,php如何“知道”getNextSequence()函数是什么?你能解释一下吗?当然,代码应该是“$db->getNextSequence”吗。upsert-表示如果集合中不存在该条目,它将创建。至于方法,则简单得多。您必须在php上编写它。(更新了上面的例子)马克西姆,我现在要离开办公室,但我明天第一件事就是复习你更新的答案!!谢谢但我的下一个问题是什么是反模型::类?反模型-它是隐藏的东西:1。连接到数据库2。集合的选择也是因为类MongoDatabase{static function getInstance(){…}},您调用MongoDatabase::getInstance()->selectCollection('counters')->FindModifyMaxim,我尝试了$result=MongoDatabase::getInstance()->selectCollection('counters')->FindModifyMaxim(还有对CounterModel的调用,但都失败了,错误是php找不到该类
MongoDatabase::getInstance()->selectCollection('counters')->findAndModify(...)
db->collection->find()->sort(array('id' => -1))->limit(1)