Обновление php mongoDB не работает

1

Я пытаюсь обновить каждый документ в коллекции mongoDB с новым полем. Это отлично работает при выборе конкретного документа его mongoID, а затем вставка определенного поля, но когда я пытаюсь сделать это в цикле, он как-то перестает работать. См. Код ниже. Кто-нибудь знает, почему это не удается?

$m = new MongoClient();
$db = $m->selectDB('SocialMedia');
$collection = new MongoCollection($db, 'testcoord');
$myC = $collection->find();
foreach($myC as $tweet){
$testCoord = array($tweet['coordinates']['coordinates'][0],$tweet['coordinates']['coordinates'][1]);
    foreach ($areaArray as $area) {
        if (pointInPolygon($area,$testCoord)){
            $collection->update(array('_id'=>$tweet['_id']),array('$set' => array('city_area' => $area['areaName'])));
        }
        }
}
Теги:

1 ответ

0

Ваш примерный код не заполнен, потому что нет определений $ areaArray и pointInPolygon(), поэтому сложнее понять, какова ваша цель.

Однако обратите внимание, что вы обновляете один и тот же документ несколько раз в цикле foreach, поэтому ваше поле city_area переписывается каждый раз (это работает оператор $ set).

    // this is how your updates go
    $collection->update(['_id' => 'tweet_1'], ['$set' => ['city_area' => 'value1']);
    $collection->update(['_id' => 'tweet_1'], ['$set' => ['city_area' => 'value2']);
    $collection->update(['_id' => 'tweet_1'], ['$set' => ['city_area' => 'value3']);
    // now your document with id = 'tweet_1' contains 'city_area' = 'value3'
    // 'value1' and 'value2' are rewrited

Если вы хотите сохранить несколько значений в одном поле, вместо этого используйте вместо этого оператор $ addToSet. В противном случае исправьте свой код в соответствии с вашей целью.

Например, этот код работает отлично:

    $mongoClient = new MongoClient();
    $db = $mongoClient->selectDB('Test');
    $collection = new MongoCollection($db, 'test_collection');

    // inserting 5 documents with values from 1 to 5
    foreach (range(1, 5) as $value) {
        $collection->insert(
            ['value' => $value]
        );
    }

    // find and update each document with new value
    $cursor = $collection->find();
    foreach ($cursor as $doc) {
        $newValue = 2; // insert here your code, calculating new value for each document
        $collection->update(
            ['_id'=>$doc['_id']], 
            ['$set' => ['value' => newValue]]
        );
    }
    // now we have 5 documents with field 'value' equals 2 each

Ещё вопросы

Сообщество Overcoder
Наверх
Меню