关于NodeJs为啥要用mongoose操作mongodb
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于NodeJs为啥要用mongoose操作mongodb相关的知识,希望对你有一定的参考价值。
node.js操作mongodb提供了多种驱动,包含mongoose,mongoskin,node-mongodb-native(官方)等。Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为javascript对象以供你在应用中使用! 参考技术A 有官方的驱动,用mongoose主要是更方便使用
为啥 Mongoose 在 DB 中存在时响应空字段
【中文标题】为啥 Mongoose 在 DB 中存在时响应空字段【英文标题】:Why Mongoose is responding null field when it exists in DB为什么 Mongoose 在 DB 中存在时响应空字段 【发布时间】:2015-04-22 07:23:29 【问题描述】:我不知道这是猫鼬虫还是我做错了什么,我的问题是:
我在 mongoDB 中有一些文档,它们有一个名为 address 的属性,其中有一个国家,它是一个对象 ID,但是当我使用 mongoose 进行查询时,这个国家 ID 为“null”:
Mongoose 架构
password:
type: String,
trim: true,
required: true,
index: true
,
email:
type: String,
trim: true,
required: true,
index:
unique: true
,
address:
address:
type: String,
default: ''
,
city:
type: String,
default: ''
,
zipCode:
type: String,
default: ''
,
country:
type: Schema.ObjectId,
ref: 'Country',
default: '54e635cb4ef1d41d99b837e8',
required: true
MongoDB 文档:
"_id" : ObjectId("54b7ff802d244c9f224c78f4"),
"password" : "12345",
"email" : "email@email.com",
// ...
"address" :
"country" : ObjectId("54e635cb4ef1d41d99b837e8"),
"zipCode" : "",
"city" : "",
"address" : ""
猫鼬查询
Model.findOne(
email: 'email@email.com',
password: '12345'
, function(err, model) /* ... */ );
猫鼬反应
"_id": "54b7ff802d244c9f224c78f4",
"email": "email@email.com",
"password" : "12345",
// ...
"address":
"country": null,
"zipCode": "",
"city": "",
"address": ""
我真的不知道为什么国家会变成空。 我的 Mongo 版本是 2.6.6,mongoose 版本是 3.8.21。
有什么想法吗?
【问题讨论】:
您可以编辑您的问题以添加您的架构定义吗? 谢谢JohnnyHK,我只是添加它 嗯...当我尝试使用该架构和示例文档时,它运行良好。 【参考方案1】:这可以使用populate修复
Model.findOne(
email: 'email@email.com',
password: '12345'
).populate('address country').exec(function (error, user)
// ...
);
【讨论】:
谢谢,但是......实际上这个想法是填充国家,但猫鼬无法做到,因为值是空值。 您的完整查询是否涉及.select('some fields of the user but no_address')
?【参考方案2】:
我已经解决了,我会描述我是如何解决的:
将 mongoose 更新到 3.8.23(我认为没有任何区别)。
当我运行 init 脚本时,该脚本会导入一个带有国家数据的 csv 文档,因此国家 _id 在每次 mongoimport 时都会发生变化;所以我做了一个 mongodump,现在在初始化脚本中我恢复了集合而不是导入它。
我认为最后一点之所以不同是因为 _id;在架构中,我设置了集合中不存在的默认 ObjectId,这就是为什么我决定进行还原以保存所有 _id。
【讨论】:
以上是关于关于NodeJs为啥要用mongoose操作mongodb的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS/Express/Mongoose 出错 Can't set headers after they are sent
为啥我的 jQuery .ajax() 路由的 .done() 方法没有在我的 NodeJS、Express 和 Mongoose 项目中触发?