Я пытаюсь обновить каждый документ в коллекции 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'])));
}
}
}
Ваш примерный код не заполнен, потому что нет определений $ 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