nsmyself
nsmyself

Reputation: 3565

MongoDB can't get all the rows

I've got a project using the MEAN stack and inside the Mongo DB collection I've got a collection called 'services' with the following rows (a small subset):

{ "_id" : ObjectId("55af611de2be6d817d000001"), "client" : "55a8e5fa586f94752a000002", "collaborators" : null, "date" : ISODate("2015-07-22T09:23:41.917Z"), "latestUpdateDate" : ISODate("2015-07-22T09:23:41.917Z"), "backofficeRequested" : false, "description" : "Uma descrição qq", "wasSeen" : 0, "currentStatusId" : "0", "lastStatusId" : 4, "__v" : 2, "addresses" : [ ], "dates" : [ ], "estimateDuration" : 61, "estimatePrice" : "55", "notes" : [ ], "serviceDate" : ISODate("2015-07-23T10:07:00Z"), "totalPrice" : "600", "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }
{ "_id" : ObjectId("55afa8662c1e98c80d2fd2ff"), "client" : "55a8e5fa586f94752a000002", "estimatePrice" : "12", "estimateDuration" : NumberLong(720), "description" : "12", "serviceDate" : ISODate("1212-12-12T12:48:45Z"), "lastStatusId" : null, "currentStatusId" : "0", "collaborators" : [ { "id" : "55acb6022c1e98d05f2fd2ff" } ], "dates" : [ ], "totalPrice" : "", "backofficeRequested" : NumberLong(0), "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }
{ "_id" : ObjectId("55afa9f62c1e98370e2fd2ff"), "client" : "55ae68d82c1e98ac782fd303", "estimatePrice" : "12", "estimateDuration" : NumberLong(720), "description" : "12", "serviceDate" : ISODate("1212-12-12T12:48:45Z"), "lastStatusId" : null, "currentStatusId" : "1", "collaborators" : [ { "id" : "55acb6022c1e98d05f2fd2ff" } ], "dates" : [ ], "totalPrice" : "500", "backofficeRequested" : NumberLong(0), "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }
{ "_id" : ObjectId("55afaa7e2c1e98bc0d2fd2ff"), "client" : "55a8e5fa586f94752a000002", "estimatePrice" : "12", "estimateDuration" : NumberLong(720), "description" : "12", "serviceDate" : ISODate("1212-12-12T12:48:45Z"), "lastStatusId" : null, "currentStatusId" : "0", "collaborators" : [ { "id" : "55acb6022c1e98d05f2fd2ff" } ], "dates" : [ ], "totalPrice" : "", "backofficeRequested" : NumberLong(0), "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }
{ "_id" : ObjectId("55afaf582c1e98d80d2fd303"), "client" : "55ae68d82c1e98ac782fd303", "estimatePrice" : "1", "estimateDuration" : NumberLong(60), "description" : "1", "serviceDate" : ISODate("1111-11-11T11:47:45Z"), "lastStatusId" : null, "currentStatusId" : "4", "collaborators" : [ { "id" : "55ae40772c1e98007a2fd2ff" } ], "dates" : [ ], "totalPrice" : "", "backofficeRequested" : NumberLong(0), "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }
{ "_id" : ObjectId("55afb8472c1e98370e2fd300"), "client" : "55a8e5fa586f94752a000002", "estimatePrice" : "1", "estimateDuration" : NumberLong(60), "description" : "1", "serviceDate" : ISODate("1111-11-11T11:47:45Z"), "lastStatusId" : null, "currentStatusId" : NumberLong(2), "collaborators" : [ { "id" : "55ae40772c1e98007a2fd2ff" } ], "dates" : [ ], "totalPrice" : "", "backofficeRequested" : NumberLong(0), "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }
{ "_id" : ObjectId("55aff2dc2c1e98ac112fd2ff"), "client" : "55a8e5fa586f94752a000002", "estimatePrice" : "1", "estimateDuration" : NumberLong(720), "description" : "1", "serviceDate" : ISODate("1989-12-12T12:12:00Z"), "lastStatusId" : null, "currentStatusId" : NumberLong(2), "collaborators" : [ { "id" : "55ae40772c1e98007a2fd2ff" } ], "dates" : [ ], "totalPrice" : "", "backofficeRequested" : NumberLong(0), "serviceInvoiced" : "No", "evaluation" : "", "positiveFeatures" : "", "negativeFeatures" : "" }

I want to get all the rows belonging to the client with the ID "55a8e5fa586f94752a000002".

It's pretty easy to do in the mongo Shell:

db.services.find({"client":"55a8e5fa586f94752a000002"})

But I am having a hard time inside Node.js because it either returns no services at all or it ends up returning just one service.

Here's what I'm using right now:

(...)

console.log(checkDatas[0]._id);
Service.find().where('client', checkDatas[0]._id)
.exec(function(err, services)
{
    console.log("output: " + services);

(...)

And finally, here's the output:

**55a8e5fa586f94752a000002**

**output**: { _id: 55aff719af19b58913000001,
  client: 55a8e5fa586f94752a000002,
  __v: 1,
  collaborators: [ { id: '55acb6022c1e98d05f2fd2ff' } ],
  notes: [],
  dates: [],
  addresses: [],
  date: Wed Jul 22 2015 22:03:37 GMT+0200 (CEST),
  latestUpdateDate: Wed Jul 22 2015 22:03:37 GMT+0200 (CEST),
  backofficeRequested: false,
  totalPrice: null,
  estimatePrice: null,
  estimateDuration: null,
  description: '',
  serviceDate: null,
  wasSeen: 0,
  currentStatusId: 3,
  lastStatusId: 1 }

It's as if I were using findOne but I'm not.

On top of that, yesterday I had a .sort() method also in that query and things worked fine after commenting it but today the problem's back.

Do MongoDB / Node have some sort of caching system I'm not aware of?

Thanks

EDIT:

Running

Service.find({'client': checkDatas[0]._id})

yields the same result

Upvotes: 1

Views: 61

Answers (1)

robertklep
robertklep

Reputation: 203419

It looks like you're mixing ObjectId's and strings, which are two different things.

Your Mongoose query is looking for an ObjectId:

Service.find().where('client', checkDatas[0]._id)

Quick tip: you can distinguish both types in the output:

// ObjectId, because it doesn't have quotes around it
client: 55a8e5fa586f94752a000002
// String
collaborators: [ { id: '55acb6022c1e98d05f2fd2ff' } ]

Your MongoDB shell query is looking for a string:

db.services.find({"client":"55a8e5fa586f94752a000002"})

The subset you're posting shows only strings, but I think that your database may actually contain both types. You can check and see if this works better:

Service.find().or([
  { client : checkDatas[0]._id },
  { client : String(checkDatas[0]._id) }
])...

Obviously this isn't ideal, you should consider normalizing your database if both types are mixed.

EDIT: the or query probably won't work when using Mongoose, since it will cast both clauses to the type defined in the schema. You can still check from the Mongo shell:

db.services.find({ $or : [
 { client : "55a8e5fa586f94752a000002" },
 { client : ObjectId("55a8e5fa586f94752a000002") }
]})

Upvotes: 2

Related Questions