Làm thế nào để truy cập bộ sưu tập có sẵn với Mongoose?


139

Tôi có một bộ sưu tập lớn gồm 300 questionđối tượng trong cơ sở dữ liệu test. Tôi có thể dễ dàng tương tác với bộ sưu tập này thông qua trình vỏ tương tác của MongoDB; tuy nhiên, khi tôi cố gắng lấy bộ sưu tập thông qua Mongoose trong một ứng dụng express.js, tôi nhận được một mảng trống.

Câu hỏi của tôi là, làm thế nào tôi có thể truy cập tập dữ liệu đã có sẵn này thay vì tạo lại nó một cách nhanh chóng? Đây là một số mã:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');
mongoose.model('question', new Schema({ url: String, text: String, id: Number }));

var questions = mongoose.model('question');
questions.find({}, function(err, data) { console.log(err, data, data.length); });

Kết quả này:

null [] 0

Câu trả lời:


251

Mongoose đã thêm khả năng chỉ định tên bộ sưu tập trong lược đồ hoặc làm đối số thứ ba khi khai báo mô hình. Nếu không, nó sẽ sử dụng phiên bản số nhiều được đặt theo tên bạn ánh xạ tới mô hình.

Hãy thử một cái gì đó như sau, hoặc là ánh xạ lược đồ:

new Schema({ url: String, text: String, id: Number}, 
           { collection : 'question' });   // collection name

hoặc mô hình được ánh xạ:

mongoose.model('Question', 
               new Schema({ url: String, text: String, id: Number}), 
               'question');     // collection name

9
Tôi có thể tìm thấy thông tin này ở đâu trong tài liệu? Điều này thực sự được hỗ trợ nhưng không có nơi nào giải thích điều số nhiều.
StudioWorks

Xin chào, @calvinfo làm cách nào để thay đổi tên bộ sưu tập khi chạy? Tôi có 5 bộ sưu tập UserSchema và tôi muốn đặt cho mỗi người một tên khác nhau Eg: users_server1, users_server2, users_server3 ...
Ragnar

1
Yêu cầu cung cấp ví dụ truy vấn, ví dụ vớiModel.collection.insert();..
Steve K

6
Tương tự ở đây, tôi dành nhiều giờ để tìm ra vấn đề này, tài liệu được tìm thấy ở đây mongoosejs.com/docs/guide.html#collection
ElvinD

3
Điều này làm việc cho tôi. Tôi đã có một bộ sưu tập người dùng mà tôi mong muốn. Để có quyền truy cập vào nó với cầy mangut tôi đã làmmongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
jack trống

61

Đây là một bản tóm tắt câu trả lời của Will Nathan nếu bất cứ ai chỉ muốn một chức năng bổ trợ sao chép dễ dán:

function find (name, query, cb) {
    mongoose.connection.db.collection(name, function (err, collection) {
       collection.find(query).toArray(cb);
   });
}

chỉ cần làm find(collection_name, query, callback);để được kết quả.

ví dụ: nếu tôi có tài liệu {a: 1} trong bộ sưu tập 'foo' và tôi muốn liệt kê các thuộc tính của nó, tôi làm điều này:

find('foo', {a : 1}, function (err, docs) {
            console.dir(docs);
        });
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ]

Điều này rất hữu ích khi chạy thử nghiệm tích hợp trên API
Greg

xin chào, đây có phải là một hoạt động nguyên tử? Giả sử tôi cố gắng lưu tài liệu trong chức năng gọi lại. đây sẽ là nguyên tử?
Maulik Soneji

23

Bạn có thể làm một cái gì đó như thế này, hơn là bạn sẽ truy cập các hàm mongodb riêng bên trong cầy mangut:

var mongoose = require("mongoose");
mongoose.connect('mongodb://localhost/local');

var connection = mongoose.connection;

connection.on('error', console.error.bind(console, 'connection error:'));
connection.once('open', function () {

    connection.db.collection("YourCollectionName", function(err, collection){
        collection.find({}).toArray(function(err, data){
            console.log(data); // it will print your collection data
        })
    });

});

1
Câu trả lời hoàn hảo!
NếnCoder

15

Tôi gặp vấn đề tương tự và có thể chạy truy vấn không có lược đồ bằng cách sử dụng kết nối Mongoose hiện có với mã bên dưới. Tôi đã thêm một ràng buộc đơn giản 'a = b' để hiển thị nơi bạn sẽ thêm một ràng buộc như vậy:

var action = function (err, collection) {
    // Locate all the entries using find
    collection.find({'a':'b'}).toArray(function(err, results) {
        /* whatever you want to do with the results in node such as the following
             res.render('home', {
                 'title': 'MyTitle',
                 'data': results
             });
        */
    });
};

mongoose.connection.db.collection('question', action);

1
Đây chính xác là những gì tôi đang tìm kiếm vì cầy mangut không có bất kỳ sự hỗ trợ nào của GridFS. Tôi sử dụng phương pháp này để lấy siêu dữ liệu tệp từ Gridfs (Gridstore). Chỉ cần thay thế questionmã ở trên fs.filesvà bạn sẽ ổn.
k00k

7

Bạn có chắc là bạn đã kết nối với db? (Tôi hỏi vì tôi không thấy một cổng được chỉ định)

thử:

mongoose.connection.on("open", function(){
  console.log("mongodb is connected!!");
});

Ngoài ra, bạn có thể thực hiện "hiển thị các bộ sưu tập" trong vỏ mongo để xem các bộ sưu tập trong db của mình - có thể thử thêm bản ghi qua mongoose và xem nó kết thúc ở đâu?

Từ giao diện của chuỗi kết nối của bạn, bạn sẽ thấy bản ghi trong db "kiểm tra".

Hy vọng nó giúp!


4
Thật thú vị, nó thực sự lưu trữ thông tin trong một questionsbộ sưu tập khi dữ liệu tôi đang cố truy cập nằm trong một questionbộ sưu tập. Mongoose có tự động số nhiều tên bộ sưu tập / mô hình không?
theabraham

Vâng tôi nghĩ rằng nó ... ha! Tôi mới bắt đầu, vì vậy tôi chưa khám phá tất cả các ngõ ngách ... nhưng tôi nhớ rằng đã thấy làn gió hạt dẻ đó khi tôi quay vòng qua Google Groups.
nhộn nhịp

3

Đối với tôi, một điều khác không rõ ràng, đó là khi sử dụng tham số thứ ba của Mongoose để tránh thay thế bộ sưu tập thực sự bằng một cái mới có cùng tên, new Schema(...)thực ra chỉ là một trình giữ chỗ và không can thiệp vào exisitng lược đồ như vậy

var User = mongoose.model('User', new Schema({ url: String, text: String, id: Number}, { collection : 'users' }));   // collection name;
User.find({}, function(err, data) { console.log(err, data, data.length);});

hoạt động tốt và trả về tất cả các trường - ngay cả khi Lược đồ (từ xa) thực tế không chứa các trường này. Mongoose vẫn sẽ muốn nó new Schema(...), và một biến gần như chắc chắn sẽ không hack nó.


1
nó đưa ra lỗi 'tên bộ sưu tập phải là chuỗi' đối với tôi, Chỉnh sửa: như câu trả lời của 'calvinfo, Nếu bạn muốn đặt tên bộ sưu tập trong hàm tạo mô hình, bạn chỉ cần chuyển tên bộ sưu tập ở dạng chuỗi không phải mô hình đối tượng. vì vậy câu trả lời của bạn sẽ đúng nếu chỉnh sửa như thế này, var User = mongoose.model ('Người dùng', Lược đồ mới ({url: Chuỗi, văn bản: Chuỗi, id: Số}, 'người dùng')); // tên bộ sưu tập; User.find ({}, function (err, data) {console.log (err, data, data.length);});
Kaan Erkoç
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.