Заполните поле ref в mon go (используя mon goose) по другому пути - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть объект модели, который выглядит следующим образом:

   OrderSchema = new Schema({
        order_id: {type: String, unique: true},
        customer: {
            address:addressModel,
            first_name : {type:String, default:''},
            last_name : {type:String, default:''},
            company : {type:String, default:''},
            phone1 : phoneModel,
            phone2 : phoneModel,
            email : {type:String},
            mask : {type:Boolean, default:false},
        },
        retailer: {
            _id: { type: Schema.Types.ObjectId, ref: 'Retailer' }
        }
    }

, а продавец выглядит так:

RetailerSchema = new Schema({
    company: {type:String, required: true},
    identifier: {type:String, required: true, unique: true},
    first_name: {type:String},
    last_name: {type:String},
    address: addressModel,
    phone1:phoneModel,
    phone2:phoneModel
})

, когда я использую функцию .populate mon goose, полученный объект выглядит примерно так:

queryCall.populate('retailer._id','company address')

...

 "retailer": {
        "_id": {
            "address": {
                "address1": "51 Astor Place",
                "address2": "",
                "city": "New York",
                "state": "NY",
                "zip": "10003"
            },
            "_id": "5d4482a35555d200208b3cd4",
            "company": "123"
        }
    }

Есть ли способ создать карту, которая после заполнения заполненного объекта будет просто расширением поля, которое заполняется, следовательно, что-то вроде ниже. Я пытаюсь выяснить, есть ли способ заполнить результат другим путем на полученном объекте.

   "retailer": {
        "_id": "5d4482a35555d200208b3cd4",
        "address": {
                "address1": "51 Astor Place",
                "address2": "",
                "city": "New York",
                "state": "NY",
                "zip": "10003"
            }
        },
        "company": "123"
    }

1 Ответ

0 голосов
/ 30 апреля 2020

Просто измените поле retailer из схемы OrderSchema на:

retailer: { type: Schema.Types.ObjectId, ref: 'Retailer' }

и вызовите .populate следующим образом:

queryCall.populate('retailer', 'company address')

Если вы не можете редактировать схему тогда вы можете использовать агрегирование следующим образом:

OrderSchema.aggregate([/* { $match: { // put your conditions here }  } */])
  .lookup({ from: 'retailers', localField: 'retailer._id', foreignField: '_id', as: 'retailer' })
  .unwind('retailer')
  .project({
    // other fields,
    retailer: {
      address: 1,
      company: 1
    }
  })

Или, если вы хотите использовать только javascript:

return orders.map(order => (order.retailer = order.retailer._id, order));
...