关于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为啥要用mongoose操作mongodb

egg-mongoose --- nodejs

为啥 localhost 不适用于节点 js api

NodeJS/Express/Mongoose 出错 Can't set headers after they are sent

为啥我的 jQuery .ajax() 路由的 .done() 方法没有在我的 NodeJS、Express 和 Mongoose 项目中触发?

为啥要用nodejs