2013-07-08 32 views
8

Tôi mới vào node.js và mongodb và tôi có vấn đề sau: Tôi cần phải thả tất cả các bộ sưu tập từ mongodb của tôi từ tệp node.js. Tôi có một chức năng như:Làm thế nào để thả tất cả các bộ sưu tập thông qua mongodb và node.js?

service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
    var name = colls[i].name; 
    db.dropCollection(name, function(err) { 
     if(!err) { 
      console.log(name + " dropped"); 
     } else { 
      console.log("!ERROR! " + err.errmsg); 
     } 
    }); 
    } 
} 

Và tôi đang sử dụng nó trong các chức năng sau:

service.clearDB = function() { 
var MongoClient = require('mongodb').MongoClient 
, format = require('util').format;  

    MongoClient.connect('mongodb://127.0.0.1:27017/shiny_d', function(err, db){ 
    if(err) throw err; 
    db.collectionNames(function(err, collections){ 
     if(!err){ 
      service.dropCollections(db, collections); 
     } else { 
      console.log("!ERROR! "+ err.errmsg); 
     } 
     service.showCollections(); 
    }); 
    }); 
} 

Là một đầu ra tôi có

LỖI! NS không tìm thấy

shiny_db.physicalinfos

Dunno phải làm gì ngay bây giờ. Tôi sẽ rất biết ơn sự giúp đỡ của bạn.

+0

Không xóa bất kỳ thứ gì bắt đầu bằng 'hệ thống' vì những thứ đó được dành riêng cho MongoDB sử dụng. – WiredPrairie

+0

Bạn có thể nói với tôi hove để tránh chúng? –

+0

chỉ cần kiểm tra xem chuỗi có bắt đầu bằng 'hệ thống' hay không. – WiredPrairie

Trả lời

3

Tôi tìm thấy một câu trả lời. Trước hết, tôi đã mắc lỗi trong kết nối của mình, nó phải giống như sau: 'mongodb://127.0.0.1:27017/shiny_db'. Sai lầm thứ hai là trong tên của bộ sưu tập. Nó giống như 'db_name.coll_name', đó là lý do tại sao db.dropCollection(name, callback) không thể tìm thấy bộ sưu tập cụ thể và vì tôi đã nhầm lẫn ns not found. Vì vậy, tôi đã sử dụng cơ chế sau để tách db_name khỏi coll_name:

var name = colls[i].name.substring('shiny_db.'.length); và tôi đã thêm kiểm tra bộ sưu tập "hệ thống".

mã cuối cùng trông giống như sau:

service.clearDB = function() { 
    var MongoClient = require('mongodb').MongoClient 
    , format = require('util').format;  

    MongoClient.connect('mongodb://localhost/shiny_db', function(err, db) { 
     if(err) throw err; 
     db.collectionNames(function(err, collections){ 
      if(!err){ 
       service.dropCollections(db, collections);     
      } else { 
       console.log("!ERROR! "+ err.errmsg); 
      } 
     }); 
    }); 
} 
service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
     var name = colls[i].name.substring('shiny_db.'.length); 

     if (name.substring(0, 6) !== "system") { 
      db.dropCollection(name, function(err) { 
       if(!err) { 
        console.log(name + " dropped"); 
       } else { 
        console.log("!ERROR! " + err.errmsg); 
       } 
      }); 
     } else { 
      console.log(name + " cannot be dropped because it's a system file"); 
     }  
    } 
} 

Hy vọng nó sẽ giúp một ai đó!

7

Không dễ xảy ra lỗi nhanh hơn, dễ dàng hơn và ít hơn nếu bạn chỉ thả toàn bộ cơ sở dữ liệu?

db.dropDatabase(); 

Ít nhất từ ​​Mongo CLI, bất cứ khi nào bạn truy cập DB không tồn tại, nó sẽ tiếp tục tồn tại ngay sau khi bạn tạo dữ liệu. Điều đó cũng giống như bỏ tất cả các bộ sưu tập khỏi nó.

Tôi chưa thử MongoDB cho bất cứ điều gì ngoại trừ việc học tập, vì vậy tôi không biết nhiều về quyền. Vì vậy, có lẽ vấn đề duy nhất của việc bỏ toàn bộ DB sẽ là quyền của người dùng của bạn sẽ bị mất (tôi tin).

Nếu tập lệnh này bạn đang cố gắng tạo không dành cho quá trình sản xuất, thì bạn nên thực hiện với việc bỏ DB.

+0

tốt, nó không phải là mục tiêu của tôi;) –

0

listCollections cung cấp cho bạn một loạt tên bộ sưu tập dưới dạng chuỗi.

Dường như bạn có thể gây nhầm lẫn nó với cái gì mà trả về một mảng các đối tượng bộ sưu tập như lẽ db.collections()

+0

Nhưng sự khác biệt những gì cần sử dụng để xác định tên bộ sưu tập? Tôi chỉ cần tên của các bộ sưu tập để sử dụng chúng như các đối số trong 'db.dropCollection (tên, gọi lại)' –

+0

nếu nó cho bạn trở lại một đối tượng bạn cần sử dụng obj.name để lấy tên. nếu nó cung cấp cho bạn tên, bạn không nên sử dụng name.name. –

+0

Vâng, tôi đã kiểm tra những gì 'collectionNames' trả về, và nó trả về một bộ sưu tập với đối tượng, có một trường" tên ". Nhưng câu trả lời của bạn mang lại cho tôi một ý tưởng thành công, cảm ơn rất nhiều! –

Các vấn đề liên quan