37

I have tried using find and findOne and both are not returning a document. find is returning an empty array while findOne is returning null. err in both cases in null as well.

Here is my connection:

function connectToDB(){
    mongoose.connect("mongodb://localhost/test"); //i have also tried 127.0.0.1
    db = mongoose.connection;
    db.on("error", console.error.bind(console, "connection error:"));
    db.once("open", function callback(){
        console.log("CONNECTED");
    });
};

Here is my schema:

var fileSchema = mongoose.Schema({
    hash: String,
    type: String,
    extension: String,
    size: String,
    uploaded: {type:Date, default:(Date.now)},
    expires: {type:Date, default:(Date.now()+oneDay)}
});
var Model = mongoose.model("Model", fileSchema);

And my query is here:

Model.find({},function(err, file) {
    console.log(err)
    console.log(file);  
});

I can upload things to the database and see them via RockMongo but I cannot fetch them after. This my first time using MongoDB so I think I'm just missing some of the fundamentals. Any push in the right direction would be great!

locrizak
  • 12,192
  • 12
  • 60
  • 80

7 Answers7

79

The call to mongoose.model establishes the name of the collection the model is tied to, with the default being the pluralized, lower-cased model name. So with your code, that would be 'models'. To use the model with the files collection, change that line to:

var Model = mongoose.model("Model", fileSchema, "files");

or

var Model = mongoose.model("file", fileSchema);
JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
  • 5
    Saved the day. Thanks a lot! It's a pity this is not highlighted in the official guide. – thameera Nov 16 '13 at 11:35
  • @thameera same here. I'm moving into uncharted waters from .net land and I wasted so much time on this one. Lifesaver. Yea, convention does not seemed to be mentioned _anywhere_, at least in my search attempts. Thank you!!! – scniro Dec 01 '15 at 15:06
  • I found this out the hard way too -- that model("object",...) actually creates a collection called "objects". ORMs that are a bit too magical, but fortunately there's Stack Overflow! – Case Larsen Apr 08 '18 at 04:17
  • See also https://stackoverflow.com/questions/7486528/mongoose-force-collection-name – Case Larsen Apr 08 '18 at 07:07
3

Simply inorder to avoid pluralization complexity use this:

var Model = mongoose.model("Model", fileSchema, "pure name your db collection");

It's very confusing.[at least for me.]

Prageeth godage
  • 4,054
  • 3
  • 29
  • 45
1

Had kinda same problem. The solutions above didnt work for me. My app never returns error even if the query is not found. It returns empty array. So i put this in my code:

if(queryResult.length==0) return res.status(404).send("not found");
1

This issue is probably coming from the fact that you are creating a mongoose model without specifying the name of the collection.

Try changing : const Model = mongoose.model("Model", fileSchema);

To this : const Model = mongoose.model("Model", fileSchema, "NameOfCollection");

Eugène Beliaev
  • 1,041
  • 10
  • 4
0
const growingUnit= mongoose.model('Growing Unit', growingUnitSchema);

I had a space in 'Growing Unit' on purpose and it always returned empty array. Removing that space to become 'GrowingUnit' was the fix needed in my scenario.

const growingUnit= mongoose.model('Growing Unit', growingUnitSchema);
pokumars
  • 161
  • 11
0

General "hello world" issues (Sometimes this issue not related to mongoose).

  1. Check if the collection is not really empty (mongoDB atlas screenshot).

enter image description here

  1. Check for small spelling differences (Like listing instead of listings) in your collection queries commands.

  2. Check if you use the correct URI for your connection (For example you are trying to retrieve data from a collection that exists in localhost but use mongoDB cluster (Cloud) -or- any other issue related to Connection String URI). https://docs.mongodb.com/manual/reference/connection-string/

Ezra Siton
  • 6,887
  • 2
  • 25
  • 37
0

For me the issue was .skip(value), I was passing page=1 instead of page=0. As I was having few records, I was getting empty array always.

Mohammad Zaid Pathan
  • 16,304
  • 7
  • 99
  • 130