2015-08-06 2 views
0

У меня есть одна коллекция, которая состоит из сгенерированных данных отчета.MongoDB: Push связанных данных из другой коллекции

продукты:

{ 
    location: 'Spain', 
    month: 5, 
    year: 2015, 
    name: 'Cup', 
    price: 100.32, 
    type: 1 
}, 
    ... 

Тогда у меня есть важные данные:

Сообщить:

{ 
    location: 'Spain', 
    month: 5, 
    year: 2015, 
    stdPrice: 110.22, 
    products : [] // Here is where I'd like to insert related data (location, month, year) 
//from Products 
} 

Данные должны храниться обратно в БД.

Что-то вроде:

products.forEach(function(product){ 
    report.forEach(function(data){ 
    if(product['location'] === data['location'] && product['month'] === data['month'] && product['year'] === data['year']){ 
     data['products'].push(product); 
    } 
    }); 
}); 

Кто знает, как этого добиться? Я думал, что сокращение карты будет хорошим способом сделать это. Я хотел бы также сделать это с помощью мангуста.

Спасибо!

+0

Возможно, это поможет [http://stackoverflow.com/questions/31865472/mongodb-push-related-data-from-another-collection](http://stackoverflow.com/questions/31865472/mongodb-push данные о связанных-с-другом-коллекции-). –

ответ

0

Я был в состоянии сделать эту работу самостоятельно. Я не выполнял вручную после операций x, потому что сам не работал.

Каждая группа операций может иметь не более 1000 операций. Если группа превышает этот предел, MongoDB разделит группу на более мелкие группы, равные 1000 или менее. Например, если список массовых операций состоит из 2000 операций вставки, MongoDB создает 2 группы, каждая из которых имеет 1000 операций.

Source

var bulk = mongoose.model('Report').collection.initializeOrderedBulkOp(); 

    mongoose.model('Product').find({}).exec(function (error, doc) { 
     doc.forEach(function (value, index) { 
      if (index % 500 === 0) { 
       console.log('Current index: ', index); 
      } 
      bulk.find({ 
       location: value._doc.location, 
       month: {$lte: value._doc.month} 
      }).updateOne({ 
       "$push": { 
        "products": { 
         "location": doc.location, 
         "month": doc.month, 
         "year": doc.year, 
         "name": doc.name, 
         "price": doc.price, 
         "type": doc.type 
        } 
       } 
      }); 
     }); 
     console.log('Bulk Executing'); 
     bulk.execute(function (err, results) { 
      if (err) 
       console.error(err); 
      else 
       console.log(results.toJSON()); 
     }); 
    }); 

Кредит @yogesh для кода MongoDB.

-1

Используйте mongo bulk операции, как показано ниже:

var bulk = db.report.initializeOrderedBulkOp(), 
    count = 0; 
db.products.find().forEach(function(doc) { 
    bulk.find({ 
     "location": doc.location, 
     "month": doc.month 
    }).updateOne({ 
     "$push": { 
      "products": { 
       "location": doc.location, 
       "month": doc.month, 
       "year": doc.year, 
       "name": doc.name, 
       "price": doc.price, 
       "type": doc.type 
      } 
     } 
    }); 
    count += 2; 
    if(count % 500 == 0) { 
     bulk.execute(); 
     bulk = db.report.initializeOrderedBulkOp(); 
    } 
}); 
if(count % 500 !== 0) bulk.execute(); 

для исх check this

+0

Как вы используете forEach? Не '.find()' возвращает обещание? Я использую mongoose btw. – ECMAScript

Смежные вопросы