2015-01-29 3 views
3

У меня есть набор данных, и мне нужно добавить для каждого документа новое поле. Если я выполнить запрос, чтобы получить все документы и обновление каждого один node.js останавливается, может быть для памяти утечкиnodejs mongoose bulk update

Это мой код

var express = require('express'); 

var geocoderProvider = 'google'; 
var httpAdapter = 'http'; 

var People = require("./models/people").collection.initializeOrderedBulkOp(); 

var app = express(); 

var geocoder = require('node-geocoder').getGeocoder(geocoderProvider, httpAdapter, {}); 

app.get('/', function (req, res) { 
    People.find({}, function (err, docs) { 
    if (err) { 
     res.send(err); 
    }else{ 
     docs.forEach(function (doc){ 
     geocoder.geocode({address: doc.address, country: 'Italy', zipcode: doc.cap}, function(error, value) { 
      doc.loc.coordinates[0]=value[0].latitude; 
      doc.loc.coordinates[1]=value[0].longitude; 
      People.update({ _id: doc._id }, { $set: { loc: doc.loc }}, { multi: true }, function (error){ 
      if(error){ 
       console.error('ERROR!'); 
      } 
      }); 
     }); 
     }); 
    } 
    }); 
}); 

var server = app.listen(3000, function() { 
    var host = server.address().address 
    var port = server.address().port 
    console.log('Example app listening at http://%s:%s', host, port) 
}); 

Существует ли способ массового обновления с мангустом ? Заранее спасибо

+0

вы должны смотреть на использование потока - то вы можете приостановить, внести изменения, сохранить, а затем возобновить поток - редактировать : mongo допускает только атомные изменения (т. е. один документ изменяется за один раз - так что нет никаких массовых изменений) –

+0

Не похоже, чтобы node.js «останавливался» при обновлении ваших документов. Что касается массового обновления с помощью мангуста, MongoDB не поддерживает транзакции с несколькими документами. Если вы хотите что-то реализовать, посмотрите http://stackoverflow.com/questions/12493576/multi-collection-multi-document-transactions-in-mongodb – influxd

ответ

7

Вы можете опуститься до уровня коллекции и выполнить массовое обновление. Это действие не будет атомарным - некоторые из записей могут выйти из строя, а другие могут преуспеть - но это позволит вам сделать эти записи за один раунд в вашу базу данных.

Это выглядит следующим образом:

var bulk = People.collection.initializeUnorderedBulkOp(); 
bulk.find({<query>}).update({<update>}); 
bulk.find({<query2>}).update({<update2>}); 
... 
bulk.execute(function(err) { 
    ... 
}); 

Заканчивать Документов здесь: http://docs.mongodb.org/manual/core/bulk-write-operations/

16

Более подробная информация о запросе и обновления запроса.

var bulk = People.collection.initializeOrderedBulkOp(); 
    bulk.find(query).update(update); 
    bulk.execute(function (error) { 
     callback();     
    }); 

Запрос выполняется с помощью массива.
Update требуется $ набора

var bulk = People.collection.initializeOrderedBulkOp(); 
    bulk.find({'_id': {$in: []}}).update({$set: {status: 'active'}}); 
    bulk.execute(function (error) { 
     callback();     
    }); 

запроса является поиск идентификатора

var bulk = People.collection.initializeOrderedBulkOp(); 
    bulk.find({'_id': id}).update({$set: {status: 'inactive'}}); 
    bulk.execute(function (error) { 
     callback();     
    });