为什么Mongoose在DB中存在时响应空字段

时间:2015-02-20 14:59:24

标签: node.js mongodb mongoose

我不知道这是一个猫鼬错误还是我做错了什么,我的问题是:

我在mongoDB中有一些文件,这些文件有一个名为address的属性,里面有一个国家,它是一个对象id但是当我使用mongoose进行查询时,这个国家的id变为“null”:

Mongoose Schema

{
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,而猫鼬版本是3.8.21。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

可以使用populate

修复此问题
Model.findOne({
   email: 'email@email.com',
   password: '12345'
}).populate('address country').exec(function (error, user) {
  // ...
});

答案 1 :(得分:0)

我已经解决了,我将描述我是如何解决它的:

  1. 将mongoose更新为3.8.23(我认为这没有任何区别)。

  2. 当我运行init脚本时,脚本会导入带有国家/地区数据的csv doc,因此每个mongoimport上的国家_id都会发生变化。所以我制作了一个mongodump,现在在init脚本中我恢复了集合而不是导入它。

  3. 我认为最后一点因为_id而产生了不同;在模式中我设置了一个在集合中不存在的默认ObjectId,这就是为什么我决定进行恢复,以保存所有_id的。