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

时间:2016-05-11 20:32:25

标签: php mongodb

我正在关注此处找到的文档 https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/

我有两个计数器,一个叫做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()函数,因为我不知道如何执行此操作。我在此站点上发现了类似的问题: How to create auto increment field

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

编辑1

我正在考虑的是尝试使用db-> command()方法找到运行getNextSequence()的方法......然后像我这样在$ location数组中添加一个新项:

$location["_id"] = value_from_db_command; 

3 个答案:

答案 0 :(得分:0)

您需要在$ location中添加_id字段。 并且_id必须是你的身份。 例如:

function add_playbook_history_record($location)
{
        $m = new MongoClient("mongodb://10.1.1.111:27017");
        $db = $m->testdb;
        $collection = $db->testcollection;
        $location['_id'] = getNextSequence('playhistid')
        $cursor = $collection->insert($location);
}

我的建议:在findAndModify

中添加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(此模式singelton)

class MongoDatabase{
    private function __construct(){}
    public static function getInstance(){...} // return MongoClient
} 

并呼叫需要方法

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

答案 1 :(得分:0)

我们可能必须获得最大ID表格集合

db->collection->find()->sort(array('id' => -1))->limit(1)

返回最大id数组。添加db['id'] + 1;

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

答案 2 :(得分:0)

function getNextSequence($collection_name='', $seq_id='')
    {
        $mongo = (new MongoDB\Client);
        $collection = $mongo->db_name->collection_name;
        $retval =  $collection->findOneAndUpdate(
            [ '_id' => $seq_id],
            [ '$inc' => [ 'seq' => 1] ],
            [ 'upsert' => true,
              'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
            ]
        );

        $nextId = (string) $retval['seq'];
        return $nextId;
    }

app developers india

web portal development company