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

Why is my mongoose document property not properly setting to another _id property

我正在尝试设置一个简单的 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 件事:

问题一: 当我们打印出 story 对象时,我们看到 creator 字段设置为 0(我们稍后会谈到),并且出于某种原因添加了下划线(我假设是因为它链接到 ObjectId)。我还尝试为 creator 添加下划线,就像文档中显示的那样,这导致 creator 属性 根本无法保存到文档中。谁能解释一下 _ 如何与猫鼬互动?

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

问题 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,你将其更改为 'creator',但它找到了你的旧文档,因为你没有按 id 查询。尝试将您的故事查询更改为:

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