2015-06-30 3 views
1

Мне нужно создать 2000 документов сразу в Метеор. Я знаю, что могу использоватьМассовое создание в Метеор

for (i=0; i<2000; i++) { 
    CollectionName.insert({}); 
} 

но я надеюсь, что в Метеор есть функция массового создания. Как я могу вставить эти 2000 строк самым быстрым способом?

+0

вам путь является правильным. Если вы хотите получить массу, см. http://stackoverflow.com/questions/19757434/bulk-mongodb-insert-in-meteor-or-node –

+0

Посмотрите на это: http://www.markdrew.co .uk/blog/post.cfm/importing-json-in-a-meteor-mongo-database – Billybobbonnet

ответ

7

Метеор изначально не поддерживает это. Тем не менее, он дает вам доступ к драйверу узла Mongodb, который может изначально выполнять объемную вставку.

Вы можете сделать это только на сервере:

var x = new Mongo.Collection("xxx"); 

x.rawCollection.insert([doc1, doc2, doc3...], function(err, result) { 
    console.log(err, result) 
}); 

Или с MongoDB 2.6, если ваш экземпляр Метеор имеет доступ к нему:

var bulk = x.initializeUnorderedBulkOp(); 

bulk.insert({ _id: 1, item: "abc123", status: "A", soldQty: 5000 }); 
bulk.insert({ _id: 2, item: "abc456", status: "A", soldQty: 150 }); 
bulk.insert({ _id: 3, item: "abc789", status: "P", soldQty: 0 }); 
bulk.execute({ w: "majority", wtimeout: 5000 }); 

Примечания:

  • Это не синхронно или не выполняется в волокне, поскольку использует драйвер исходного узла. Вы должны использовать Meteor.bindEnvironment или Meteor.wrapAsync для создания синхронного кода
  • документы вставлены маркированные и не может быть в первоначальном порядке вы добавили их.
  • Это может занять 10 секунд для Meteor, чтобы увидеть документы «Reactively» через метод публикации, если ваш экземпляр не включен.
1

Вот что я использую:

/server/fixtures.js

var insertIntoCollection = function(collection, dataArray){ 
    dataArray.forEach(function(item){ 
    collection.insert(item); 
    }); 
}; 

if (Stuff.find().count() === 0) { 

    var array = [ 
    { 
     // document1 
    },{ 
     // document2 
    } 
    ]; 

    insertIntoCollection(Stuff, array); 
}; 
+0

Простое решение. Meteor 1.4 будет иметь Mongo 3.2 с Bulk Insert. Если у вас нет 10 000 документов, это решение будет работать очень хорошо. – TheBetterJORT

4

Расширение @ ответ Akshat, это синтаксис, который будет работать на Метеоре 1.0+

x = new Mongo.Collection("x"); 
var bulk = x.rawCollection().initializeUnorderedBulkOp(); 

bulk.insert({ _id: 1, item: "abc123", status: "A", soldQty: 5000 }); 
bulk.insert({ _id: 2, item: "abc456", status: "A", soldQty: 150 }); 
bulk.insert({ _id: 3, item: "abc789", status: "P", soldQty: 0 }); 

Meteor.wrapAsync(bulk.execute)(); 
+0

Одна вещь, которая меня отключила: если у вас есть ObjectIDs, которые вы пытаетесь вставить, вам нужно преобразовать их в представление узла ObjectID, а не в Meteor при вставке в исходную коллекцию. 'MongoInternals.NpmModule.ObjectID (your_obj_id. _str); ' – vroomfondel

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