Query Parse.com перенес связь указателя базы данных с Mongoose

Контекст

Итак, мы перешли с 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 содержит Story$ перед идентификатором объекта?

Спасибо!


person Cyril    schedule 13.04.2016    source источник
comment
Просто комментарий, но вы могли бы запустить свой собственный сервер синтаксического анализа вместо того, чтобы переписывать все запросы. github.com/ParsePlatform/parse-server. Примеры приложений упрощают задачу, раздел Пример приложения Parse Server.   -  person clay    schedule 13.04.2016
comment
Я пытался сделать то же самое, чтобы обойти некоторые ограничения. Вы смогли это осуществить?   -  person corbanb    schedule 02.05.2016


Ответы (1)


Один из вариантов, который я рассматривал, — это возможность создавать настраиваемый тип данных для каждого указателя. К сожалению, Parse рассматривает их как отношения «принадлежит» и не сохраняет отношение «hasMany», которое Mongoose хочет для populate(). Но как только это будет сделано, вы можете легко выполнять циклы для получения реляционных данных. Не идеально, но работает, и в любом случае это то, что на самом деле делает 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.Schema.Types.PointerId = require('./types/PointerTypeClass')(mongoose);

Наконец. Если вы хотите написать некоторый облачный код, вы можете создать массив идентификаторов для вашего населения, чтобы знать об объектах. В основном в вашем Object.beforeSave вы должны обновить массив идентификатора для отношения. Надеюсь это поможет.

person corbanb    schedule 02.05.2016