Поиск и поиск массивов, вложенных в несколько объектов - PullRequest
0 голосов
/ 14 апреля 2020

Я нахожу все websites, которые соответствуют идентификаторам, которые у меня есть в моем массиве, и в приведенном ниже случае это два веб-сайта. Затем я хочу заглянуть внутрь каждого из conversations массивов этих веб-сайтов и найти в другой коллекции под названием conversations разговоры, соответствующие этим идентификаторам. Затем я хочу взять некоторые / все поля из этих бесед и добавить их в уже имеющийся у меня документ JSON, сгруппировав их по беседам на каждом веб-сайте. Я играл с агрегатом, раскруткой и группой, но не могу заставить что-то работать.

router.post('/staffLoadUpTwo', async (req, res) => {
  var userId = '5e8f964a9c2d0780c0163825';

  const company = await Company.findOne({ 'roles.admins': userId });
  var unwrappedCompany = JSON.parse(JSON.stringify(company));

  console.log(unwrappedCompany.websites);

  const website = await Website.find({
    _id: { $in: unwrappedCompany.websites },
  });

  // const unwindTest = await Website.aggregate([{$unwind : "$conversations"}]);

  console.log(website);
});

console.log (веб-сайт);

[ { conversations: [ '5e90d9ceb089812c9ba1a67b', '5e8f5a6a2582bf629998c3fd' ],
    _id: 5e949cc02483c0c0056a1a98,
    domain: 'http://x.com',
    __v: 0 },
  { conversations: [ '5e8e23595ce6d611cec5033f', '5e8e3afee8e95e1ff94650d3' ],
    _id: 5e949ce8f53450c0341b36cd,
    domain: 'http://y.com',
    __v: 0 } ]

идеальный выход

[{
  _id: "5e949cc02483c0c0056a1a98",
  domain: 'http://x.com'
  conversations: [
    {conversationId: "5e90d9ceb089812c9ba1a67b", messages: {messageArray: ['a'], timeSent: 2}},
    {conversationId: "5e8f5a6a2582bf629998c3fd", messages: {messageArray: ['b'], timeSent: 6}}
]
}
  _id: "5e949ce8f53450c0341b36cd",
  domain: 'http://y.com'
  conversations: [
   {conversationId: "5e8e23595ce6d611cec5033f", messages: {messageArray: ['c'], timeSent: 1}},
   {conversationId: "5e8e3afee8e95e1ff94650d3", messages: {messageArray: ['d'], timeSent: 8}}
]
}]

1 Ответ

1 голос
/ 14 апреля 2020

Вам не нужно напрягать себя с помощью агрегации MongoDB. Поскольку вы используете Mon goose, вы можете легко использовать mon goose populate для достижения результата, который вы описали в вопросе.

При условии, что вы определили схему сайта следующим образом:

const websiteSchema = {
  // ...schema definition for other properties
  /* Note the ref property used below, the value must be the name of the
    conversation model, i.e the stringValue you passed into 
    mongoose.model(<stringValue>, conversationSchema); */
  conversations: [ { type: mongoose.Types.ObjectId, ref: 'Conversations' } ]
}

Мон goose запрос, подобный следующему:

const website = await Website.find({
    _id: { $in: unwrappedCompany.websites },
  }).populate('conversations');

выведет массив документов веб-сайта, чье поле разговоров заполнено, т. е. вы получаете фактический документ разговора, а не только их _ids.

Подробнее о пн goose заполнить здесь

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