Mon goose включает поля из вторичного документа, используя $ lookup - PullRequest
1 голос
/ 13 января 2020

Я хочу отобразить все местоположения и прикрепить заказы (если они есть) к ответу.

Пример документа местоположений:

{
  id: "LOCATION_A_OBJECTID",
  name: "Location A"
},
{
  id: "LOCATION_B_OBJECTID",
  name: "Location B"
},
{
  id: "LOCATION_C_OBJECTID",
  name: "Location C"
}

Пример документа заказов: (2 заказа на A, 1 на B, на 0 на C)

{
  id: "5e17a001f1e0220def7a2b5d",
  location: "LOCATION_A_OBJECTID", 
  products: [1,2,3]
},
{
  id: "5e17a001f1e0220def7a2b5d",
  name: "LOCATION_B_OBJECTID",
  products: [1,2,3]
},
{
  id: "5e17a001f1e0220def7a2b5d",
  name: "LOCATION_A_OBJECTID",
  products: [1,2,3]
}

Ожидаемый результат:

{
  id: "LOCATION_A_OBJECTID",
  name: ...
  products: ...
   ...
},
{
  id: "LOCATION_B_OBJECTID",
  name: ...
  products: ...
  ...
}
...

Редактировать Здесь будут размещены мои схемы, потому что что-то просто не прав.

Схема заказа

const mongoose = require('mongoose')

const orderSchema = mongoose.Schema({
  location: {
    type: mongoose.Schema.Types.ObjectId
  },
  timestamp: {
    type: Date, default: Date.now
  },
  status: Number,
  products: Array,
  total:   Number
})

module.exports = mongoose.model('Order', orderSchema)

Схема расположения:

const mongoose = require('mongoose')

const locationSchema = mongoose.Schema({
  name: String,
  address: String
})

module.exports = mongoose.model('Location', locationSchema)

1 Ответ

1 голос
/ 13 января 2020

Вам нужно $ поиск с пользовательским конвейером для сопоставления с полем name или location, а затем просто вы можете запустить $project, чтобы получить желаемый формат ваших документов результатов:

db.Locations.aggregate([
    {
        $lookup: {
            from: "Orders",
            let: { loc_id: "$_id" },
            pipeline: [
                { $match: { $expr: { $eq: [ "$$loc_id", "$_id" ] } } },
                { $project: { _id: 0, products: 1 } }
            ],
            as: "orders"
        }
    },
    {
        $match: { orders: { $ne: [] } }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            products: "$orders.products"
        }
    }
])

Пн go Детская площадка

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