因此我们已从Parse.com迁移到托管的MongoDB数据库。现在我必须编写一个直接查询数据库的脚本(不使用Parse)。
我使用nodejs / mongoose并且能够检索这些文档。
到目前为止,这是我的架构:
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$
,是否有办法让获取的活动填充其故事?
谢谢!
答案 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数组。希望这会有所帮助。