我正在关注此处找到的文档 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;
答案 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;
}