Как манипулировать полями и ссылками, которые считываются из базы данных с помощью Mongoose?

, выбрав опцию, мне нужно обновить фрагмент, который в настоящее время виден.

Чтобы получить ссылку на текущий видимый фрагмент, предположим, что у вас есть ссылка на ViewPager как mPager. Затем следующие шаги получат ссылку на currentFragment:

  1. PageAdapter adapter = mPager.getAdapter();
  2. int fragmentIndex = mPager.getCurrentItem();
  3. FragmentStatePagerAdapter fspa = (FragmentStatePagerAdapter)adapter;
  4. Fragment currentFragment = fspa.getItem(fragmentIndex);

Обычно используется только литая строка 3. FragmentStatePagerAdapter является полезным адаптером для ViewPager.

0
задан user2921009 17 January 2019 в 01:44
поделиться

2 ответа

Я действительно нашел другой способ, который, как я полагаю, более оптимизирован, потому что он делегирует всю эту работу фактическому движку базы данных. Это использует совокупность. При этом мне даже не нужно создавать совершенно новую модель для фрагмента - я могу просто получить ее из основной модели. Вот как я это сделал:

Employee.aggregate()
  .lookup({
    from: 'cities',
    localField: 'residenceAddress.city',
    foreignField: '_id',
    as: 'residenceAddress'
  })
  .addFields({
    residenceCity: { $arrayElemAt: ['$residenceAddress', 0] },
    residenceState: { $arrayElemAt: ['$residenceAddress', 0] }
  })
  .project({
    firstName: 1,
    lastName: 1,
    residenceCity: '$residenceCity.cityName',
    residenceState: '$residenceState.state',
  })
  .then((result) => {
    // do whatever stuff I need with the snippet resulting from this process
  });

0
ответ дан user2921009 17 January 2019 в 01:44
поделиться

OK. Я нашел решение, которое работает, хотя я не знаю, является ли оно оптимальным для случаев, когда я рисую большое количество документов модели из БД. Но, в любом случае, вот оно.

Мне нужно использовать почтовый хук для init в схеме фрагмента. Другими словами, EmployeeSnippet должен выглядеть так:

const EmployeeSnippetSchema = new Schema({
  firstName: String,
  lastName: String,
  address: {
    city: {
      type: Schema.Types.ObjectId,
      ref: 'City',
      autopopulate: { select: 'cityName state' }
    }
  },
  residenceCity: String,
  residenceState: String
});

Я просто добавляю следующий хук:

[ 1111]
EmployeeSnippetSchema.post('init', function(doc) {
  if (doc.address && doc.address.city) {
    doc.residenceCity = doc.address.city.cityName;
    doc.residenceState = doc.address.state;
  }
  
  delete doc.address;
});

И это работает, хотя, как я сказал ранее, я не знаю, является ли это оптимизированным решением, когда мы получаем большое количество документы, но это лучшее, что я мог придумать.

P.S. Я только что понял, что использовал «autopopulate», который не является функцией, которая поставляется из коробки с мангустом. На самом деле это плагин команды Mongoose: http://plugins.mongoosejs.io/plugins/autopopulate

0
ответ дан user2921009 17 January 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: