我正在尝试设置一个简单的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件事:
问题1: 当我们打印出故事对象时,我们看到创建者字段设置为0(我们稍后会对此进行处理),并且由于某种原因添加了下划线(我假设它是因为它链接到一个ObjectId)。我还尝试向创建者添加下划线,就像文档中显示的一样,这导致创建者属性根本不会保存到文档中。谁能解释_如何与猫鼬交互?
问题2: 当我们尝试设置creator时:aaron_id它被设置为0,我们知道arron._id不是0,因为我们在相同的范围内成功打印它。我做错了什么?
答案 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
});