查询Parse.com迁移了与Mongoose的数据库指针关系

时间:2016-04-13 13:43:42

标签: node.js parse-platform mongoose

上下文

因此我们已从Parse.com迁移到托管的MongoDB数据库。现在我必须编写一个直接查询数据库的脚本(不使用Parse)。

我使用nodejs / mongoose并且能够检索这些文档。

问题

Document with relation ship example

到目前为止,这是我的架构:

var StorySchema = new mongoose.Schema({
  _id: String,
  genre: String
});

var ActivitySchema = new mongoose.Schema({
  _id: String,
  action: String,
  _p_story: String /* Also tried: { type: mongoose.Schema.Types.ObjectId, ref: 'Story' } and { type: String, ref: 'Story' }*/,
});

我想写一个查询,用相关的故事(存储为指针)获取这些文档。

Activity
  .find({
    action: 'read',
  })
  .exec(function(error, activities) {
    activities.forEach(function(activity) {
      // I would like to use activity._p_story or whatever the mean to access the story here
    });
  });

问题

考虑到_p_story字段在对象ID之前包含Story$,是否有办法让获取的活动填充其故事?

谢谢!

1 个答案:

答案 0 :(得分:0)

我一直在关注的一个选项是为每个指针创建自定义数据类型的能力。不幸的一面是Parse将这些视为属于'属于'关系,但不存储'hasMany' Mongoose想要populate()的关系。但是一旦到位,您就可以轻松地进行循环以获取关系数据。不理想但是有效并且无论如何都是人们在幕后做的事情。

PointerTypeClass.js - >这可以用于填充相反的方向。

var Pointer = function(mongoose) {

    function PointerId(key, options) {
        mongoose.SchemaType.call(this, key, options, 'PointerId');
    }

    PointerId.prototype = Object.create(mongoose.SchemaType.prototype);

    PointerId.prototype.cast = function(val) {
        return 'Pointer$' + val;
    }

    return PointerId;
}


module.exports = Pointer;

还要确保mongoose通过执行mongoose.Schema.Types.PointerId = require('./types/PointerTypeClass')(mongoose);

了解新类型

最后。如果您愿意编写一些云代码,您可以为您的填充创建ID数组,以了解对象。基本上在您的Object.beforeSave中,您将更新关系的id数组。希望这会有所帮助。