Model.findOne not returning docs but returning a wrapper object
up vote
4
down vote
favorite
I have defined a Model with mongoose like this:
var mongoose = require("mongoose")
var Schema = mongoose.Schema
var userObject = Object.create({
alias: String,
email: String,
password: String,
updated: {
type: Date,
default: Date.now
}
})
var userSchema = new Schema(userObject, {strict: false})
var User = mongoose.model('User', userSchema)
module.exports = User
Then I created a user that I can perfectly find through mongo console like this:
db.users.findOne({ email: "coco@coco.com" });
{
"_id" : ObjectId("55e97420d82ebdea3497afc7"),
"password" : "caff3a46ebe640e5b4175a26f11105bf7e18be76",
"gravatar" : "a4bfba4352aeadf620acb1468337fa49",
"email" : "coco@coco.com",
"alias" : "coco",
"updated" : ISODate("2015-09-04T10:36:16.059Z"),
"apps" : [ ],
"__v" : 0
}
However, when I try to access this object through a node.js with mongoose, the object a retrieve is not such doc, but a wrapper:
This piece of code...
// Find the user for which the login queries
var User = require('../models/User')
User.findOne({ email: mail }, function(err, doc) {
if (err) throw err
if (doc) {
console.dir(doc)
if(doc.password == pass) // Passwords won't match
Produces this output from console.dir(doc)...
{ '$__':
{ strictMode: false,
selected: undefined,
shardval: undefined,
saveError: undefined,
validationError: undefined,
adhocPaths: undefined,
removing: undefined,
inserting: undefined,
version: undefined,
getters: {},
_id: undefined,
populate: undefined,
populated: undefined,
wasPopulated: false,
scope: undefined,
activePaths: { paths: [Object], states: [Object], stateNames: [Object] },
ownerDocument: undefined,
fullPath: undefined,
emitter: { domain: null, _events: {}, _maxListeners: 0 } },
isNew: false,
errors: undefined,
_doc:
{ __v: 0,
apps: ,
updated: Fri Sep 04 2015 12:36:16 GMT+0200 (CEST),
alias: 'coco',
email: 'coco@coco.com',
gravatar: 'a4bfba4352aeadf620acb1468337fa49',
password: 'caff3a46ebe640e5b4175a26f11105bf7e18be76',
_id: { _bsontype: 'ObjectID', id: 'Uét Ø.½ê4¯Ç' } },
'$__original_validate': { [Function] numAsyncPres: 0 },
validate: [Function: wrappedPointCut],
_pres: { '$__original_validate': [ [Object] ] },
_posts: { '$__original_validate': } }
Therefore, passwords won't match because doc.password is undefined.
Why is this caused?
node.js mongodb mongoose nodes
add a comment |
up vote
4
down vote
favorite
I have defined a Model with mongoose like this:
var mongoose = require("mongoose")
var Schema = mongoose.Schema
var userObject = Object.create({
alias: String,
email: String,
password: String,
updated: {
type: Date,
default: Date.now
}
})
var userSchema = new Schema(userObject, {strict: false})
var User = mongoose.model('User', userSchema)
module.exports = User
Then I created a user that I can perfectly find through mongo console like this:
db.users.findOne({ email: "coco@coco.com" });
{
"_id" : ObjectId("55e97420d82ebdea3497afc7"),
"password" : "caff3a46ebe640e5b4175a26f11105bf7e18be76",
"gravatar" : "a4bfba4352aeadf620acb1468337fa49",
"email" : "coco@coco.com",
"alias" : "coco",
"updated" : ISODate("2015-09-04T10:36:16.059Z"),
"apps" : [ ],
"__v" : 0
}
However, when I try to access this object through a node.js with mongoose, the object a retrieve is not such doc, but a wrapper:
This piece of code...
// Find the user for which the login queries
var User = require('../models/User')
User.findOne({ email: mail }, function(err, doc) {
if (err) throw err
if (doc) {
console.dir(doc)
if(doc.password == pass) // Passwords won't match
Produces this output from console.dir(doc)...
{ '$__':
{ strictMode: false,
selected: undefined,
shardval: undefined,
saveError: undefined,
validationError: undefined,
adhocPaths: undefined,
removing: undefined,
inserting: undefined,
version: undefined,
getters: {},
_id: undefined,
populate: undefined,
populated: undefined,
wasPopulated: false,
scope: undefined,
activePaths: { paths: [Object], states: [Object], stateNames: [Object] },
ownerDocument: undefined,
fullPath: undefined,
emitter: { domain: null, _events: {}, _maxListeners: 0 } },
isNew: false,
errors: undefined,
_doc:
{ __v: 0,
apps: ,
updated: Fri Sep 04 2015 12:36:16 GMT+0200 (CEST),
alias: 'coco',
email: 'coco@coco.com',
gravatar: 'a4bfba4352aeadf620acb1468337fa49',
password: 'caff3a46ebe640e5b4175a26f11105bf7e18be76',
_id: { _bsontype: 'ObjectID', id: 'Uét Ø.½ê4¯Ç' } },
'$__original_validate': { [Function] numAsyncPres: 0 },
validate: [Function: wrappedPointCut],
_pres: { '$__original_validate': [ [Object] ] },
_posts: { '$__original_validate': } }
Therefore, passwords won't match because doc.password is undefined.
Why is this caused?
node.js mongodb mongoose nodes
1
Useconsole.log, notconsole.dirto sanely log Mongoose model instances.
– JohnnyHK
Sep 4 '15 at 13:04
Yeah, as a factconsole.log(doc)only printed the wrapped document, but the password validation still did not work anddoc.passwordstill returnedundefinedwithoutconsole.dir(doc).
– jsdario
Sep 4 '15 at 13:49
add a comment |
up vote
4
down vote
favorite
up vote
4
down vote
favorite
I have defined a Model with mongoose like this:
var mongoose = require("mongoose")
var Schema = mongoose.Schema
var userObject = Object.create({
alias: String,
email: String,
password: String,
updated: {
type: Date,
default: Date.now
}
})
var userSchema = new Schema(userObject, {strict: false})
var User = mongoose.model('User', userSchema)
module.exports = User
Then I created a user that I can perfectly find through mongo console like this:
db.users.findOne({ email: "coco@coco.com" });
{
"_id" : ObjectId("55e97420d82ebdea3497afc7"),
"password" : "caff3a46ebe640e5b4175a26f11105bf7e18be76",
"gravatar" : "a4bfba4352aeadf620acb1468337fa49",
"email" : "coco@coco.com",
"alias" : "coco",
"updated" : ISODate("2015-09-04T10:36:16.059Z"),
"apps" : [ ],
"__v" : 0
}
However, when I try to access this object through a node.js with mongoose, the object a retrieve is not such doc, but a wrapper:
This piece of code...
// Find the user for which the login queries
var User = require('../models/User')
User.findOne({ email: mail }, function(err, doc) {
if (err) throw err
if (doc) {
console.dir(doc)
if(doc.password == pass) // Passwords won't match
Produces this output from console.dir(doc)...
{ '$__':
{ strictMode: false,
selected: undefined,
shardval: undefined,
saveError: undefined,
validationError: undefined,
adhocPaths: undefined,
removing: undefined,
inserting: undefined,
version: undefined,
getters: {},
_id: undefined,
populate: undefined,
populated: undefined,
wasPopulated: false,
scope: undefined,
activePaths: { paths: [Object], states: [Object], stateNames: [Object] },
ownerDocument: undefined,
fullPath: undefined,
emitter: { domain: null, _events: {}, _maxListeners: 0 } },
isNew: false,
errors: undefined,
_doc:
{ __v: 0,
apps: ,
updated: Fri Sep 04 2015 12:36:16 GMT+0200 (CEST),
alias: 'coco',
email: 'coco@coco.com',
gravatar: 'a4bfba4352aeadf620acb1468337fa49',
password: 'caff3a46ebe640e5b4175a26f11105bf7e18be76',
_id: { _bsontype: 'ObjectID', id: 'Uét Ø.½ê4¯Ç' } },
'$__original_validate': { [Function] numAsyncPres: 0 },
validate: [Function: wrappedPointCut],
_pres: { '$__original_validate': [ [Object] ] },
_posts: { '$__original_validate': } }
Therefore, passwords won't match because doc.password is undefined.
Why is this caused?
node.js mongodb mongoose nodes
I have defined a Model with mongoose like this:
var mongoose = require("mongoose")
var Schema = mongoose.Schema
var userObject = Object.create({
alias: String,
email: String,
password: String,
updated: {
type: Date,
default: Date.now
}
})
var userSchema = new Schema(userObject, {strict: false})
var User = mongoose.model('User', userSchema)
module.exports = User
Then I created a user that I can perfectly find through mongo console like this:
db.users.findOne({ email: "coco@coco.com" });
{
"_id" : ObjectId("55e97420d82ebdea3497afc7"),
"password" : "caff3a46ebe640e5b4175a26f11105bf7e18be76",
"gravatar" : "a4bfba4352aeadf620acb1468337fa49",
"email" : "coco@coco.com",
"alias" : "coco",
"updated" : ISODate("2015-09-04T10:36:16.059Z"),
"apps" : [ ],
"__v" : 0
}
However, when I try to access this object through a node.js with mongoose, the object a retrieve is not such doc, but a wrapper:
This piece of code...
// Find the user for which the login queries
var User = require('../models/User')
User.findOne({ email: mail }, function(err, doc) {
if (err) throw err
if (doc) {
console.dir(doc)
if(doc.password == pass) // Passwords won't match
Produces this output from console.dir(doc)...
{ '$__':
{ strictMode: false,
selected: undefined,
shardval: undefined,
saveError: undefined,
validationError: undefined,
adhocPaths: undefined,
removing: undefined,
inserting: undefined,
version: undefined,
getters: {},
_id: undefined,
populate: undefined,
populated: undefined,
wasPopulated: false,
scope: undefined,
activePaths: { paths: [Object], states: [Object], stateNames: [Object] },
ownerDocument: undefined,
fullPath: undefined,
emitter: { domain: null, _events: {}, _maxListeners: 0 } },
isNew: false,
errors: undefined,
_doc:
{ __v: 0,
apps: ,
updated: Fri Sep 04 2015 12:36:16 GMT+0200 (CEST),
alias: 'coco',
email: 'coco@coco.com',
gravatar: 'a4bfba4352aeadf620acb1468337fa49',
password: 'caff3a46ebe640e5b4175a26f11105bf7e18be76',
_id: { _bsontype: 'ObjectID', id: 'Uét Ø.½ê4¯Ç' } },
'$__original_validate': { [Function] numAsyncPres: 0 },
validate: [Function: wrappedPointCut],
_pres: { '$__original_validate': [ [Object] ] },
_posts: { '$__original_validate': } }
Therefore, passwords won't match because doc.password is undefined.
Why is this caused?
node.js mongodb mongoose nodes
node.js mongodb mongoose nodes
asked Sep 4 '15 at 11:53
jsdario
1,67912155
1,67912155
1
Useconsole.log, notconsole.dirto sanely log Mongoose model instances.
– JohnnyHK
Sep 4 '15 at 13:04
Yeah, as a factconsole.log(doc)only printed the wrapped document, but the password validation still did not work anddoc.passwordstill returnedundefinedwithoutconsole.dir(doc).
– jsdario
Sep 4 '15 at 13:49
add a comment |
1
Useconsole.log, notconsole.dirto sanely log Mongoose model instances.
– JohnnyHK
Sep 4 '15 at 13:04
Yeah, as a factconsole.log(doc)only printed the wrapped document, but the password validation still did not work anddoc.passwordstill returnedundefinedwithoutconsole.dir(doc).
– jsdario
Sep 4 '15 at 13:49
1
1
Use
console.log, not console.dir to sanely log Mongoose model instances.– JohnnyHK
Sep 4 '15 at 13:04
Use
console.log, not console.dir to sanely log Mongoose model instances.– JohnnyHK
Sep 4 '15 at 13:04
Yeah, as a fact
console.log(doc) only printed the wrapped document, but the password validation still did not work and doc.password still returned undefined without console.dir(doc).– jsdario
Sep 4 '15 at 13:49
Yeah, as a fact
console.log(doc) only printed the wrapped document, but the password validation still did not work and doc.password still returned undefined without console.dir(doc).– jsdario
Sep 4 '15 at 13:49
add a comment |
1 Answer
1
active
oldest
votes
up vote
5
down vote
accepted
That's exactly the purpose of mongoose, wrapping mongo objects. It's what provides the ability to call mongoose methods on your documents. If you'd like the simple object, you can call .toObject() or use a lean query if you don't plan on using any mongoose magic on it at all. That being said, the equality check should still hold as doc.password returns doc._doc.password.
1
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method.toObject()is not used?
– jsdario
Sep 4 '15 at 13:44
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
1
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (likeperson.occupation). In my case that did not work, sincedoc.passwordalways returnsundefinedunless I apply.toObject()first.
– jsdario
Sep 4 '15 at 13:56
1
Try this:doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you accessperson.occupationit returnsperson._doc.occupation. This is why I don't understand your error. Ifdoc.toObject().passwordmakes your code work,doc.passwordshould work as well.
– cdbajorin
Sep 4 '15 at 14:19
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
5
down vote
accepted
That's exactly the purpose of mongoose, wrapping mongo objects. It's what provides the ability to call mongoose methods on your documents. If you'd like the simple object, you can call .toObject() or use a lean query if you don't plan on using any mongoose magic on it at all. That being said, the equality check should still hold as doc.password returns doc._doc.password.
1
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method.toObject()is not used?
– jsdario
Sep 4 '15 at 13:44
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
1
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (likeperson.occupation). In my case that did not work, sincedoc.passwordalways returnsundefinedunless I apply.toObject()first.
– jsdario
Sep 4 '15 at 13:56
1
Try this:doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you accessperson.occupationit returnsperson._doc.occupation. This is why I don't understand your error. Ifdoc.toObject().passwordmakes your code work,doc.passwordshould work as well.
– cdbajorin
Sep 4 '15 at 14:19
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
add a comment |
up vote
5
down vote
accepted
That's exactly the purpose of mongoose, wrapping mongo objects. It's what provides the ability to call mongoose methods on your documents. If you'd like the simple object, you can call .toObject() or use a lean query if you don't plan on using any mongoose magic on it at all. That being said, the equality check should still hold as doc.password returns doc._doc.password.
1
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method.toObject()is not used?
– jsdario
Sep 4 '15 at 13:44
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
1
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (likeperson.occupation). In my case that did not work, sincedoc.passwordalways returnsundefinedunless I apply.toObject()first.
– jsdario
Sep 4 '15 at 13:56
1
Try this:doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you accessperson.occupationit returnsperson._doc.occupation. This is why I don't understand your error. Ifdoc.toObject().passwordmakes your code work,doc.passwordshould work as well.
– cdbajorin
Sep 4 '15 at 14:19
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
add a comment |
up vote
5
down vote
accepted
up vote
5
down vote
accepted
That's exactly the purpose of mongoose, wrapping mongo objects. It's what provides the ability to call mongoose methods on your documents. If you'd like the simple object, you can call .toObject() or use a lean query if you don't plan on using any mongoose magic on it at all. That being said, the equality check should still hold as doc.password returns doc._doc.password.
That's exactly the purpose of mongoose, wrapping mongo objects. It's what provides the ability to call mongoose methods on your documents. If you'd like the simple object, you can call .toObject() or use a lean query if you don't plan on using any mongoose magic on it at all. That being said, the equality check should still hold as doc.password returns doc._doc.password.
answered Sep 4 '15 at 12:58
cdbajorin
3,73811025
3,73811025
1
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method.toObject()is not used?
– jsdario
Sep 4 '15 at 13:44
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
1
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (likeperson.occupation). In my case that did not work, sincedoc.passwordalways returnsundefinedunless I apply.toObject()first.
– jsdario
Sep 4 '15 at 13:56
1
Try this:doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you accessperson.occupationit returnsperson._doc.occupation. This is why I don't understand your error. Ifdoc.toObject().passwordmakes your code work,doc.passwordshould work as well.
– cdbajorin
Sep 4 '15 at 14:19
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
add a comment |
1
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method.toObject()is not used?
– jsdario
Sep 4 '15 at 13:44
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
1
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (likeperson.occupation). In my case that did not work, sincedoc.passwordalways returnsundefinedunless I apply.toObject()first.
– jsdario
Sep 4 '15 at 13:56
1
Try this:doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you accessperson.occupationit returnsperson._doc.occupation. This is why I don't understand your error. Ifdoc.toObject().passwordmakes your code work,doc.passwordshould work as well.
– cdbajorin
Sep 4 '15 at 14:19
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
1
1
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method
.toObject() is not used?– jsdario
Sep 4 '15 at 13:44
Great. It worked! Thank you really. Do you know why in several tutorials and snippets –like this one in mongoose docs– the method
.toObject() is not used?– jsdario
Sep 4 '15 at 13:44
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
It's not a necessity. If you're using mongoose, chances are, you want the mongoose document.
– cdbajorin
Sep 4 '15 at 13:46
1
1
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (like
person.occupation). In my case that did not work, since doc.password always returns undefined unless I apply .toObject() first.– jsdario
Sep 4 '15 at 13:56
Sorry to be so insisting I want to fully understand; In the linked example mongoose object is used to access directly to document params (like
person.occupation). In my case that did not work, since doc.password always returns undefined unless I apply .toObject() first.– jsdario
Sep 4 '15 at 13:56
1
1
Try this:
doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you access person.occupation it returns person._doc.occupation. This is why I don't understand your error. If doc.toObject().password makes your code work, doc.password should work as well.– cdbajorin
Sep 4 '15 at 14:19
Try this:
doc.password === doc._doc.password. That should evaluate to true. In the example you linked, when you access person.occupation it returns person._doc.occupation. This is why I don't understand your error. If doc.toObject().password makes your code work, doc.password should work as well.– cdbajorin
Sep 4 '15 at 14:19
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
Thank you soo much!! This bit just helped me fix an issue that had me stuck for hours. I was trying to modify my server side rendered React app config thinking that this was a react context issue but turns out it was MongoDB.
– Larrydx
Nov 11 '17 at 18:43
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f32397419%2fmodel-findone-not-returning-docs-but-returning-a-wrapper-object%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Use
console.log, notconsole.dirto sanely log Mongoose model instances.– JohnnyHK
Sep 4 '15 at 13:04
Yeah, as a fact
console.log(doc)only printed the wrapped document, but the password validation still did not work anddoc.passwordstill returnedundefinedwithoutconsole.dir(doc).– jsdario
Sep 4 '15 at 13:49