группа с внешним полем поиска в mongodb - PullRequest
0 голосов
/ 03 июня 2018

У меня есть две разные модели:

  • Акции
  • Теги

Каждая акция имеет поле со ссылкой на идентификатор тега.Это было указано в моей схеме и работает нормально:

const PromotionSchema = mongoose.Schema({
    tags: { type: mongoose.Schema.Types.ObjectId, ref: 'Tag' }
}, { collection: 'promotions' });

Мой вопрос заключается в том, как создать собственный ответ, который группирует все рекламные акции по тегу?Примерно так:

{ 
   "tag": {
     "_id": "999",
     "value": "Lorem Ipsum"
   },
   "promotions": [{
      "_id": "0001",
      "value": "Value of promotion Nº1"
   },
   {
      "_id": "0002",
      "value": "Value of promotion Nº2"
   },
    ... And the others that have the same Tag ID assigned
   ]}
}

Прямо сейчас я получаю все рекламные акции и фильтрацию с использованием Vanilla Javascript.Мне нужно знать, как улучшить это, используя Mongoose.

1 Ответ

0 голосов
/ 03 июня 2018

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

Если у вас версия mongodb 3.6

db.promotion.aggregate([
  // stage 1
  { "$lookup": {
    "from": Promotions.collection.name,
    "let": { "tags": "$tags" },
    "pipeline": [
       { "$match": { "$expr": { "$eq": [ "$_id", "$$tags" ] } } }
     ],
     "as": "tags"
  }},
  // stage 2
  { "$addFields": { 
    "tags": { "$arrayElemAt": [ "$tags", 0 ] }
  }},
  // stage 3
  { "$group": {
    "_id": "$tags._id",
    "promotions": {
        "$push": {
            "fieldName1": "$fieldName1",
            "fieldName2": "$fieldName2",
        }
    }
  }}
 ])

Если у вас версия mongodb до 3,6

db.promotion.aggregate([
  { "$lookup": {
    "from": Promotions.collection.name,
    "localField": "tags",
    "foreignField": "_id"
     "as": "tags"
  }},
  { "$unwind": "tags" },
  { "$group": {
    "_id": "$tags._id",
    "promotions": {
        "$push": {
            "fieldName1": "$fieldName1",
            "fieldName2": "$fieldName2",
        }
    }
  }}
 ])

Оба будут давать одинаковый вывод

{ 
   "tag": {
     "_id": "999",
     "value": "Lorem Ipsum"
   },
   "promotions": [{
      "_id": "0001",
      "value": "Value of promotion Nº1"
   },
   {
      "_id": "0002",
      "value": "Value of promotion Nº2"
   }
   ]}
}
...