মঙ্গুসের সাথে কীভাবে একটি প্রিসিস্টিং সংগ্রহে অ্যাক্সেস করবেন?


139

আমার কাছে questionএকটি ডাটাবেসে 300 টি অবজেক্টের একটি বিশাল সংগ্রহ রয়েছে test। আমি এই সংগ্রহের সাথে মঙ্গোডিবি এর ইন্টারেক্টিভ শেলের মাধ্যমে সহজেই যোগাযোগ করতে পারি; যাইহোক, আমি যখন একটি এক্সপ্রেস.জেএস অ্যাপ্লিকেশনে মঙ্গুসের মাধ্যমে সংগ্রহটি সংগ্রহ করার চেষ্টা করি তখন আমি একটি খালি অ্যারে পাই।

আমার প্রশ্ন হ'ল আমি কীভাবে এই ইতিমধ্যে বিদ্যমান ডেটাসেটটিকে এক্সপ্রেসে পুনরায় তৈরি করার পরিবর্তে অ্যাক্সেস করতে পারি? এখানে কিছু কোড রয়েছে:

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); });

এই ফলাফলগুলি:

null [] 0

উত্তর:


251

মোঙ্গুজ সংগ্রহের নামটি স্কিমার অধীনে বা মডেলটি ঘোষণার সময় তৃতীয় যুক্তি হিসাবে উল্লেখ করার ক্ষমতা যুক্ত করেছিলেন। অন্যথায় এটি আপনার মডেলটিতে মানচিত্রের নাম দিয়ে দেওয়া বহুবচন সংস্করণ ব্যবহার করবে।

নিম্নলিখিতগুলির মতো কিছু চেষ্টা করুন, হয় স্কিমা-ম্যাপড:

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

বা মডেল ম্যাপ করা:

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

9
দস্তাবেজগুলিতে আমি কোথায় এই তথ্যটি পেতে পারি? এটি সত্যিই হেল্পড হয়েছে তবে বহুবচনটির ব্যাখ্যা দেওয়ার মতো কোনও জায়গা নেই।
ওয়ার্কস

হাই, @ ক্যালভিনফো কীভাবে আমি রানটাইমে সংগ্রহের নামটি পরিবর্তন করতে পারি? আমার কাছে ইউজারশেমার 5 টি সংগ্রহ রয়েছে এবং আমি প্রত্যেকে আলাদা আলাদা নাম দিতে চাই উদাহরণস্বরূপ: ব্যবহারকারীদের_সারভার 1, ব্যবহারকারীদের_সভার 2, ব্যবহারকারী_সার্ভার 3 ...
রাগনার

1
প্লাই উদাহরণস্বরূপ ক্যোয়ারী সরবরাহ করে, উদাহরণস্বরূপModel.collection.insert();..
স্টিভ কে

6
এখানে একই, আমি এই সমস্যাটি সনাক্ত করতে অনেক ঘন্টা ব্যয় করি, নথিটি এখানে পাওয়া গেছে mongoosejs.com/docs/guide.html#col
લેક્શન

3
এটি আমার পক্ষে কাজ করেছে। আমার একটি ব্যবহারকারী সংগ্রহ ছিল যা আমি মংগোরস্টোর করেছিলাম। মঙ্গুজের সাথে এটিতে অ্যাক্সেস পেতে আমি করেছিmongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
জ্যাক ফাঁকা

61

এখানে উইল নাথনের উত্তরের একটি বিমূর্ততা এখানে রয়েছে যদি কেউ কেবল একটি সহজ অনুলিপি-পেস্ট অ্যাড-ইন ফাংশন চান:

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

কেবল find(collection_name, query, callback);ফলাফল দেওয়া হবে।

উদাহরণস্বরূপ, যদি আমার কাছে একটি সংগ্রহ 'foo' এর একটি নথি {a: 1 have থাকে এবং আমি এর বৈশিষ্ট্যগুলি তালিকাবদ্ধ করতে চাই, আমি এটি করি:

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


হাই, এটি কি পারমাণবিক অপারেশন? ধরুন আমি কলব্যাক ফাংশনে ডকুমেন্টটি সংরক্ষণ করার চেষ্টা করেছি। এটি কি পারমাণবিক হবে?
মৌলিক সোনেজি

23

আপনি এই জাতীয় কিছু করতে পারেন, আপনি মঙ্গসের অভ্যন্তরে নেটিভ মঙ্গোদব ফাংশনগুলি অ্যাক্সেস করার চেয়ে:

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
নিখুঁত উত্তর!
ক্যান্ডেলকডার

15

আমারও একই সমস্যা ছিল এবং নীচের কোডের সাথে একটি বিদ্যমান মঙ্গুজ সংযোগ ব্যবহার করে স্কিমা-কম কোয়েরি চালাতে সক্ষম হয়েছি। আপনি কোথায় এইরকম প্রতিবন্ধকতা যুক্ত করবেন তা দেখাতে আমি একটি সাধারণ বাধা 'a = b' যুক্ত করেছি:

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
আমি ঠিক এটিই খুঁজছিলাম কারণ মঙ্গুজের কোনও গ্রিডএফ সমর্থন নেই। আমি গ্রিডফেস (গ্রিডস্টোর) থেকে ফাইল মেটাডেটা দখল করতে এই পদ্ধতিটি ব্যবহার করি। questionউপরের কোডটির সাথে কেবল প্রতিস্থাপন করুন fs.filesএবং আপনি যেতে ভাল।
00 কে

7

আপনি কি নিশ্চিত যে আপনি ডিবিতে সংযুক্ত আছেন? (আমি জিজ্ঞাসা করেছি কারণ আমি নির্দিষ্ট একটি বন্দর দেখতে পাচ্ছি না)

চেষ্টা করে দেখুন:

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

এছাড়াও, আপনি আপনার ডিবিতে সংগ্রহগুলি দেখতে মঙ্গো শেলের মধ্যে "শো সংগ্রহগুলি" করতে পারেন - মঙ্গুজের মাধ্যমে কোনও রেকর্ড যুক্ত করার চেষ্টা করুন এবং দেখুন কোথায় এটি শেষ?

আপনার সংযোগের স্ট্রিংয়ের চেহারা থেকে আপনার "টেস্ট" ডিবিতে রেকর্ডটি দেখা উচিত।

আশা করি এটা সাহায্য করবে!


4
মজার বিষয়, questionsআমি যে ডেটা অ্যাক্সেস করার চেষ্টা করছি সেটি কোনও সংগ্রহে থাকলে এটি আসলে তথ্য সংগ্রহের মধ্যে সংরক্ষণ করে question। মঙ্গুজ কি স্বয়ংক্রিয়ভাবে সংগ্রহ / মডেল নামগুলি বহুবচন করে?
থ্যাব্রাহাম

হ্যাঁ আমার মনে হয় এটি হয় ... হা! আমি কেবল নিজেকে শুরু করছি তাই আমি সমস্ত কুকুর এবং ক্রেইনিগুলি অন্বেষণ করি নি ... তবে আমি গুগল গ্রুপগুলির মাধ্যমে স্পিন করার সময় এই বুকে চেস্টনট বাতাস দেখে মনে পড়ছি।
busticated

3

অন্য কিছু যা আমার কাছে স্পষ্ট ছিল না, তা হ'ল প্রকৃত সংগ্রহটিকে একই নামের সাথে নতুন জায়গায় প্রতিস্থাপন করা এড়াতে মঙ্গুজের তৃতীয় প্যারামিটার ব্যবহার করার পরে, এটি new Schema(...)কেবলমাত্র স্থানধারক এবং অস্তিত্বের সাথে হস্তক্ষেপ করে না স্কিমা তাই

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);});

দুর্দান্ত কাজ করে এবং সমস্ত ক্ষেত্রকে ফিরিয়ে দেয় - আসল (দূরবর্তী) স্কিমাতে এই ক্ষেত্রগুলির কোনওটি না থাকলেও। মঙ্গুজ এখনও এটি চাইবে new Schema(...), এবং একটি পরিবর্তনশীল প্রায় অবশ্যই এটি হ্যাক করবে না।


1
এটি আমার কাছে 'সংগ্রহের নাম অবশ্যই স্ট্রিং হওয়া উচিত' ত্রুটি দেয়, সম্পাদনা করুন: 'ক্যালভিনফো'র উত্তর হিসাবে, আপনি যদি মডেল কনস্ট্রাক্টরে সংগ্রহের নাম দিতে চান তবে আপনি কেবল স্ট্রিং ফর্মের মধ্যে সংগ্রহের নামটি বস্তু মডেল হিসাবে পাস করবেন। সুতরাং আপনার উত্তরটি সত্য হবে যদি এর মতো সম্পাদনা করা হয়, var ব্যবহারকারী = মঙ্গুজ.মডেল ('ব্যবহারকারী', নতুন স্কিমা ({url: স্ট্রিং, পাঠ্য: স্ট্রিং, আইডি: সংখ্যা}, 'ব্যবহারকারী')); // সংগ্রহের নাম; ইউজার.ফাইন্ড ({}, ফাংশন (ত্রুটি, ডেটা)) so কনসোল.লগ (ত্রুটি, ডেটা, ডেটা দৈর্ঘ্য);});
কান এরকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.