0

首先,对不起我的英语,我开始学习 MongoDB。:)

我正在尝试使用 CI 库将记录插入 MongoDB(https://github.com/alexbilbie/codeigniter-mongodb-library/tree/v2)。

插入工作完美,但我无法使用推荐的函数插入自动递增getNextSequence ( http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ )。

我尝试了以下方法但没有成功。

控制器:

$data = array('_id' => 'getNextSequence("myid")', 
              'name' => 'Test '.time(),
              'email' => 'test@test.com');
$this->default_model->add($this->collection, $data);

模型:

function add($collection, $data){
    return $this->mongo_db->insert($collection, $data);
}

这将返回字符串' getNextSequence("relatorisid") '作为“_id”。

我也试过使用命令功能,像这样:

控制器:

$query = 'db.collection.insert({_id: getNextSequence("myid"), name: "Test '.time().'"});';
$ret = $this->default_model->execute($query);
var_dump($ret);

模型:

function execute($query){
    return $this->mongo_db->command($query);
}

这样,返回错误:

["errmsg"]=> string(136) "exception: JavaScript execution failed: ReferenceError: getNextSequence is not defined near 'quence("myid"), name: "Teste 1374' "
["code"]=> int(16722)
["ok"]=> float(0)

有没有人实现过类似的东西?提前致谢!

4

2 回答 2

0

我在我的一个项目中实现了一次 mongoDB。我遇到过类似的问题。但我记得有一件重要的事情是我们不能修改_id的。它的MongoDB内置正确。auto-increament加入进来也不好,MongoDB因为您需要手动实现它。

我会建议在结构中有另一列,您可以将其称为任何名称,这将是您的虚拟唯一/主键,假设列名是data_id.

$data = array('data_id' => md5(timestamp() . "<your string>"), 
              'name' => 'Test '.time(),
              'email' => 'test@test.com');

如果我们检查文档,指定Generally in MongoDB, you would not use an auto-increment pattern for the _id field, or any field, because it does not scale for databases with large numbers of documents. Typically the default value ObjectId is more ideal for the _id.这里我指的是这个链接

即使在同一个链接上,它也指定getNextSequence()我们需要编写它。它不是内置功能。

希望这对您有所帮助。

于 2013-07-23T02:40:49.943 回答
0

我也遇到了这个问题,这是我的解决方案。

将此函数添加到 appflow\application\libraries

    public function getNextSequence($name = ""){
    if (empty($name))
    {
        show_error("In order to retrieve documents from MongoDB, a collection name must be passed", 500);
    }
    try{
        $collection_1 = 'counters';
        $collection = $this->db->{$collection_1};
    $result =  $collection->findAndModify(
        ['_id' => $name],
        ['$inc' => ['seq' => 1]],
        ['seq' => true],
        ['new' => true, 'upsert' => true]
    );
    if (isset($result['seq']))
    {
        return $result['seq'];
    }
    else
    {
        return false;
    }

    }       
    catch (MongoCursorException $e)
    {
        if(isset($this->debug) == TRUE && $this->debug == TRUE)
        {
            show_error("MongoDB query failed: {$e->getMessage()}", 500);
        }
        else
        {
            show_error("MongoDB query failed.", 500);
        }
    }
}

这是使用方法。

$nextID = $this->mongo_db->getNextSequence("maindata_child");

$this->mongo_db->where(array('_id'=>$mongo_id))->push('maindata_child', array('id'=>$nextID,'data'=>$maindata_child))->update('main_data');

并且不要忘记添加集合“计数器”。

    db.counters.insert(
   {
      _id: "userid",
      seq: 0
   }
)

PS。我正在使用这个库https://github.com/bcit-ci/CodeIgniter/wiki/Using-MongoDB-in-Codeigniter 解决方案参考:http: //tbsmc.com/a/mwbwswmm-mongodb-how-to -insert-record-using-autoincrement-functionality.html

于 2016-06-24T17:24:46.117 回答