为什么我的猫鼬文档 属性 没有正确设置为另一个 _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 件事:
- arron._id
- aaron的保存回调中创建的story文档
问题一:
当我们打印出 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
});
我正在尝试设置一个简单的 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的保存回调中创建的story文档
问题一: 当我们打印出 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
});