locrizak
locrizak

Reputation: 12279

Mongoose always returning an empty array NodeJS

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!

Upvotes: 39

Views: 34741

Answers (7)

Zaid Pathan
Zaid Pathan

Reputation: 16820

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.

Upvotes: 0

Ezra Siton
Ezra Siton

Reputation: 7781

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/

Upvotes: 0

Eugène Beliaev
Eugène Beliaev

Reputation: 1111

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

Upvotes: 1

pokumars
pokumars

Reputation: 161

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

Upvotes: 0

Ahmet Korkmaz
Ahmet Korkmaz

Reputation: 88

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

Upvotes: 1

Prageeth godage
Prageeth godage

Reputation: 4574

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.]

Upvotes: 3

JohnnyHK
JohnnyHK

Reputation: 312139

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

Upvotes: 83

Related Questions