猫鼬模型ObjectId引用不起作用

时间:2018-11-05 22:20:09

标签: node.js mongoose

我正在使用Mongoose模型和参考。我一直在使用猫鼬网站上的代码,其中讨论了填充方法和引用。我试图让它在两个模型中保存各自的“引用” ID。它仅将参考ID保存在故事模型中。这是代码:

更新:在顶部添加了架构以提供帮助:

    var personSchema = Schema({
      _id: Schema.Types.ObjectId,
      name: String,
      age: Number,
      stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]
    });

    var storySchema = Schema({
      author: { 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 author = new Person({
  _id: new mongoose.Types.ObjectId(),
  name: 'Ian Fleming',
  age: 50
});

author.save(function (err) {
  if (err) return handleError(err);

  var story1 = new Story({
    title: 'Casino Royale',
    author: author._id    // assign the _id from the person
  });

  story1.save(function (err) {
    if (err) return handleError(err);
    // thats it!
  });
});

运行此代码时,它将在mongo中生成该代码:

  db.people.find()
  { "_id" : ObjectId("5be0a37f1dd61a343115e2c8"), "stories" : [ ], "name" : "Ian Fleming", "age" : 50, "__v" : 0 }
  db.stories.find()
  { "_id" : ObjectId("5be0a37f1dd61a343115e2c9"), "title" : "Casino Royale", "author" : ObjectId("5be0a37f1dd61a343115e2c8"), "__v" : 0 }

似乎没有在“故事”中的人员集合中存储任何ID。您是否也不想将故事ID保存在人员集合中?

我试图修改代码以使其能够使用(移动了作者保存功能,直到设置了故事ID之后):

 var author = new Person({
  _id: new mongoose.Types.ObjectId(),
  name: 'Ian Fleming',
  age: 50
 });

  var story1 = new Story({
    _id: new mongoose.Types.ObjectId(),
    title: 'Casino Royale',
    author: author._id    // assign the _id from the person
  });

  author.stories = story1._id;

  author.save(function (err) {
  if (err) return handleError(err);

  story1.save(function (err) {
    if (err) return handleError(err);
    // thats it!
  });

这给我一个未定义的作者。

1 个答案:

答案 0 :(得分:0)

Mongo不会仅仅因为您添加了Story对象而自动添加到“人物”“ stories”字段。

您实际上并不需要将故事ID存储在Person对象中,因为您始终可以使用

获取作者的故事列表。
db.stories.find({author: <id>})

在两个地方都存储会创建多余的信息,如果不匹配,您必须选择一个事实。最好不要重复,methinks。

更新:

出现引用可以帮助您自动填充查询中的引用字段。根据{{​​3}},您可以像这样检索作者及其故事:

db.persons.find({_id: <id>}).populate('stories')

还没有亲自使用过,但是看起来很方便。

用于填充的猫鼬文档:this post