Монго дБ поисковый запрос по массиву в один результат - PullRequest
0 голосов
/ 18 января 2019

Я выполняю запрос поиска, используя $ unwind, чтобы найти все результаты элементов массива из поля массива одной коллекции, объединенной с другой коллекцией. Я использую следующий запрос:

db.getCollection('Products').aggregate([{$unwind:"$SupplierOffers"},{$lookup:{from:"Offers", localField:"SupplierOffers",foreignField:"_id", as:"Producttypes"}},
{$project:{"Producttypes.offeringType":1, _id:1}}])

Фактические результаты

{
    "_id" : ObjectId("5bfe8978192b5c14e8d88ba7"),
    "Producttypes" : [ 
        {
            "offeringType" : "package A"
        }
    ]
}

{
    "_id" : ObjectId("5bfe8978192b5c14e8d88ba7"),
    "Producttypes" : [ 
        {
            "offeringType" : "package B"
        }
    ]
}

из-за аннотации раскрутки, возможно, у меня есть результат как ниже:

{
    "_id" : ObjectId("5bfe8978192b5c14e8d88ba7"),
    "Producttypes" : [ 
        {
            "offeringType" : ["package A","package B"]
        }
    ]
}

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

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Это оказывается более простым, если вы сначала не $unwind оригиналы документов. $lookup может искать прямо из массива "внешних ключей", и результатом будет уже массив, избегая необходимости иметь другие $unwind и $group после.

db.getCollection('Products').aggregate([
    { $lookup: {
        from:"Offers",        
        localField:"SupplierOffers", 
        foreignField:"_id", 
        as:"Producttypes" 
    }}
])

По желанию, если вы хотите преобразовать Producttypes, чтобы в нем просто было поле offerType, вы можете добавить { $addFields: {Producttypes: '$Producttypes.offeringType' } } }

0 голосов
/ 18 января 2019

Вы правы, что ищете группу .

Попробуйте добавить это в свой конвейер

{
  $group: {
    _id: '_id',
    offeringType: { $addToSet: '$Producttypes.offeringType' }
  }
}

Редактировать: вот последний запрос из комментариев, для потомков:

db.getCollection("Products").aggregate([
  {
    $unwind: "$SupplierOffers"
  },
  {
    $lookup: {
      from: "Offers",
      localField: "SupplierOffers",
      foreignField: "_id",
      as: "Producttypes"
    }
  },
  {
    $group: {
      _id: "$_id",
      offeringType: { $addToSet: "$Producttypes.offeringType" }
    }
  },
  { $sort: { _id: 1 } }
]);

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