MongoDB - Как получить несколько коллекций из массива объектов, которые имеют свои идентификаторы - PullRequest
0 голосов
/ 30 января 2019

Итак, у меня есть база данных со следующими коллекциями.

(Использование целых чисел для представления идентификаторов объектов)

Книги:

books = [
  { _id: 1, title: "Harry Potter" },
  { _id: 2, title: "The maze runner" }
  ...
]

Клиенты:

customers = [
  { _id: 1, name: "John" },
  { _id: 2, title: "Jane"}
  ...
]

Рекомендации:

recommendations = [
  {
    customerID: 1,
    recommendations: [
      { bookID: 1, likelihood: 0.9 },
      { bookID: 2, likelihood: 0.8 }
    ]
  },
  {
    customerID: 2,
    recommendations: [
      { bookID: 2, likelihood: 0.9 },
      { bookID: 1, likelihood: 0.8 }
    ]
  }
  ...
]

Теперь, когда на мой сервер отправляется запрос, содержащий customerID в req.body, я хочу вернуть рекомендованные книги дляэтот клиент с добавленной к нему вероятностью.

, т. е.

desiredResult = [
  {
    _id: 1,
    title: "Harry Potter",
    likelihood: 0.9
  },
  {
    _id: 2,
    title: "The maze Potter",
    likelihood: 0.8
  }
  ...
]

Пожалуйста, что такое запрос агрегации MongoDB для достижения этой цели?

Ответы [ 2 ]

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

Вы можете использовать ниже aggregation

db.recommendations.aggregate([
  { "$match": { "customerID": 1 }},
  { "$unwind": "$recommendations" },
  { "$lookup": {
    "from": "books",
    "localField": "recommendations.bookID",
    "foreignField": "_id",
    "as": "recomndedBook"
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$mergeObjects": [
        { "$arrayElemAt": ["$recomndedBook", 0] },
        "$recommendations"
      ]
    }
  }}
])
0 голосов
/ 30 января 2019

Ниже Агрегация может помочь вам

db.recommendations.aggregate([
      { $match: { "customerID": 1 } },
      { $unwind: "$recommendations" },
      { $lookup: {
          from: "books",
          localField: "recommendations.bookID",
          foreignField: "_id",
          as: "recomndedBook"
      }},
      {
        $addFields: {
          title: { $arrayElemAt: [ "$recomndedBook.title", 0 ] },
          likelihood: "$recommendations.likelihood",
          bookID: "$recommendations.bookID"
        }
      },
      { 
        $project: {
          recommendations: 0,
          recomndedBook: 0,
          _id: 0,
        }
      }
    ])
...