mongoose .findById & .find возвращает объект и массив, вызывает проблему совместимости - PullRequest
0 голосов
/ 30 августа 2018

Когда пользователь посещает определенную страницу моего Приложения, Компонент отправляет действие для получения информации. А именно, действие выполняет следующие операции:

Base.find({req.params.id})
BaseUser.find({ baseId: req.params.id }) **returns multiple docs**
Message.find({ baseId: req.params.id }) **returns multiple docs**

Операция происходит в этом порядке. Я мог запросить первый через .findById, но для единообразия задачи я выбрал .find(). Проблема сейчас в том, что результаты

    Promise.all([
      Base.find({ _id: req.params.id }),
      BaseUser.find({ baseId: req.params.id }),
      Message.find({ baseId: req.params.id })
    ])

входит в массив, например:

[ 
  [ { created: 2018-08-29T23:59:35.380Z,
      _id: 5b8741151985662f10d04fdb,
      creatorId: 5b86f7970cd98b2004969bf0,
      title: 'testBase1',
  } ],
  [ { created: 2018-08-30T00:57:57.764Z,
      acceptedMembership: true,
      isCreator: true,
      _id: 5b8741151985662f10d04fdc,
      userId: 'tester1',
      baseId: 5b8741151985662f10d04fdb }
  ],
  [ { created: 2018-08-30T00:58:09.182Z,
      _id: 5b8741211985662f10d04fdd,
      baseId: 5b8741151985662f10d04fdb,
      content: 'testMessage1' } 
  ] 
]

Это, очевидно, вызывает проблемы при дальнейшей попытке отобразить / отфильтровать / res.json () данных. Есть ли какой-нибудь известный способ вернуть это в одном массиве или, что еще лучше, передать его во внешний интерфейс (действие приставки) как объект? Кто-нибудь знает лучшее решение, которое немного по-другому решает эту проблему и мешает мне выбрать каждый из этих методов на подкомпонентах?

Обновление:

Я сейчас построил это, на что довольно уродливо смотреть:

let completeObject = {
    base: {},
    users: [],
    messages: []
};

Base.findById(req.params.id)
    .then(data => {
        completeObject.base = data;
        return data;
    })
    .then(data => {
        BaseUser.find({ baseId: req.params.id })
            .then(data => {
                completeObject.users = data;
                return data;
            })
            .then(data => {
                Message.find({ baseId: req.params.id }).then(data => {
                    completeObject.messages = data;
                    return res.json(completeObject);
                });
            });
    })

1 Ответ

0 голосов
/ 30 августа 2018

Почему бы вам не установить ref в модели Base на BaseUser и Message, а затем использовать заполнить , чтобы заполнить эти массивы и получить один объект в результате, заполненный массивы BaseUser и Message?

Исходя из того, что я вижу, вы набираете req.params.id, что означает, что у вас все равно есть перекрестная ссылка между этими коллекциями.

Вот пример:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var BaseSchema = Schema({
  _id: Schema.Types.ObjectId,
  creatorId: Schema.Types.ObjectId,
  title: String,    
  users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
  messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }],

});
var UserSchema = Schema({
  _id: Schema.Types.ObjectId,
  acceptedMembership: Boolean,
  isCreator: Boolean,
  userId: String,
  baseId: Schema.Types.ObjectId
});
var MessageSchema = Schema({
  _id: Schema.Types.ObjectId,
  baseId: Schema.Types.ObjectId,
  content: String
});

var Base = mongoose.model('Base', BaseSchema);
var User = mongoose.model('User', UserSchema);
var Message = mongoose.model('Message', MessageSchema);

Теперь, когда схемы определены (и вы добавили несколько записей), вы можете найти Base на _id и заполнить users и messages:

Base.
  findOne({ _id: req.params.id }).
  populate('users').
  populate('messages').
  exec(function (err, base) {
    if (err) return handleError(err);
    console.log(base);
  });

Вы должны проверить документацию мангуста о том, как сохранить / заполнить ссылки и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...