2

我正在尝试用不同的值更新 mongodb 中的几个文档。

在 mysql 我做这样的事情:

$objs = array(array('id'=>1,'lat'=>37.123,'lng'=>53.123),...,array('id'=>n,'lat'=>x,'lng'=>y));

$sql = "INSERT INTO objects (objectId,latitude,longitude) VALUES";
        foreach ($objs as $obj) {
            $id = $obj['id'];
            $lat = $obj['lat'];
            $lng = $obj['lng'];
            $sql .= "($id,$lat,$lng),";
        }
        $sql = substr_replace($sql ," ",-1);    
        $sql.= "ON DUPLICATE KEY UPDATE latitude=VALUES(latitude),longitude=VALUES(longitude)";

现在,是否可以在 mongodb 中做到这一点?

4

2 回答 2

4

这个问题已经在这里问过:MongoDB: insert on duplicate key update

在 mongodb 中,您可以在命令上使用upsert选项。Update它类似于ON DUPLICATE KEY UPDATE. upsert选项的定义:

一种更新,它更新在提供的查询选择器中匹配的第一个文档,或者如果没有文档匹配,则插入一个新文档,其中包含查询选择器和更新操作所隐含的字段。

我已经咨询了 PHP Mongo 文档。在命令的示例#2中,MongoCollection:Update您有您的响应。

例子:

<?php
$objs = array(array('id'=>1,'lat'=>37.123,'lng'=>53.123), array('id'=>n,'lat'=>x,'lng'=>y));

foreach($objs as $obj)
{
    // Parameters: [1] Description of the objects to update. [2] The object with which to update the matching records. [3] Options 
    $collection->update(array("id" => $obj["id"]), $obj, array("upsert" => true));
}

?>
于 2013-05-20T14:46:31.897 回答
1

如果您的 SQL 中的重复键正在引用该ID字段,那么它将如下所示:

// Your big array thing from your example
$objs = array(array('id'=>1,'lat'=>37.123,'lng'=>53.123),...,array('id'=>n,'lat'=>x,'lng'=>y));
// Start a new MongoClient
$m = new MongoClient();
// Select the DB and Collection
$collection = $m->selectCollection('DBNAME', 'COLLECTIONNAME');
// Loop through $objs
foreach($objs as $obj) {
    $collection->update(
        // If we find a matching ID, update, else insert
        array('id' => $obj['id']), 
        // The data we're inserting
        $obj, 
        // specify the upsert flag, to create a new one if it can't find
        array('upsert' => true) 
    );
}

基本上,更新命令(upsert设置为 true)要么更新与更新的第一个参数匹配的现有文档,要么插入新文档。Mentor Reka的帖子更多地讨论了 upserts 的工作原理,但上面的代码应该完全符合您的要求。

于 2013-05-20T14:54:24.727 回答