为什么我的mongoose文档属性没有正确设置到另一个_id属性

时间:2015-01-19 21:02:42

标签: node.js mongoose

我正在尝试设置一个简单的mongoose测试文件,并且得到一些相当混乱的结果。当我运行以下代码时:

var mongoose = require('mongoose');
var Schema = mongoose.Schema; 
mongoose.connect('mongodb://localhost/myapp');

var personSchema = Schema({
  name    : String,
  age     : Number,
  stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = Schema({
  creator : { type: Schema.Types.ObjectId, ref: 'Person' },
  title    : String,
  fans     : [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});
var Story  = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);

var aaron = new Person({name: 'Aaron', age: 100 });

aaron.save(function (err) {
  if (err) console.log("something didnt work!");

  var story1 = new Story({
    title: "Once upon a timex.",
    creator: aaron._id  // assign the _id from the person to creator
  });
  console.log(aaron._id);
  story1.save();
});
Story.findOne({ title: 'Once upon a timex.' },function(err,story){
  console.log(story); // printing here
});

我得到了这个输出:

{
  _id: 54b9e08ed983b41d432473e4,
  title: 'Once upon a timex.',
  _creator: 0,
  __v: 0,
  fans: [] 
}
54bcacb4c812ec812382b6b2

在这方面有很多事情没有用。从我的代码中我可以看到我只有console.log(); 2件事:

  • arron._id
  • 在aaron的保存回调中创建的故事文档

问题1: 当我们打印出故事对象时,我们看到创建者字段设置为0(我们稍后会对此进行处理),并且由于某种原因添加了下划线(我假设它是因为它链接到一个ObjectId)。我还尝试向创建者添加下划线,就像文档中显示的一样,这导致创建者属性根本不会保存到文档中。谁能解释_如何与猫鼬交互?

问题2: 当我们尝试设置creator时:aaron_id它被设置为0,我们知道arron._id不是0,因为我们在相同的范围内成功打印它。我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题1:问题是查找查询在保存查询之前执行(请记住它们是异步执行的)。

尝试:

var aaron = new Person({name: 'Aaron', age: 100 });

aaron.save(function (err) {
  if (err) console.log("something didnt work!");

  var story1 = new Story({
    title: "Once upon a timex.",
    creator: aaron._id  // assign the _id from the person to creator
  });
  console.log(aaron._id);
  story1.save(function(err){
    Story.findOne({ title: 'Once upon a timex.' },function(err,story){
       console.log(story); // printing here
    });
  });
});

问题2:您确定没有查找试图保存的旧对象吗?我有一种感觉,在某些时候故事有_creator属性,你把它改成'创建者',但它找到你的旧文档,因为你不是通过id查询。尝试将您的故事查询更改为:

Story.findOne({ title: 'Once upon a timex.', creator: aaron._id },function(err,story){
  console.log(story); // printing here
});