Получение массива group _id при использовании MongoDB - PullRequest
1 голос
/ 07 мая 2020

Мне нужно вычислить некоторую запись, используя group в mongoDB, но в моем случае прибывает массив _id. Я объясняю свой запрос ниже.

let query = {
      $group: {
             _id:  "$Products.ProductName",
             dispatchcount: { $sum: 1 },
             totalDispatchValue: {$sum:"$TotalAmount.TotalPayment"},
             totalDiscountValue: {$sum: "$TotalDiscount.TotalDiscountAmount"}
      }
}
pipeLine.push(query);
const orders = await dispatchOrdersCol.aggregate(pipeLine);

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

[
            {
                "_id": [
                    "Unisex Navy Blue Belt"
                ],
                "dispatchcount": 1,
                "totalDispatchValue": 27922,
                "totalDiscountValue": 4084
            },
            {
                "_id": [
                    "Writing Ruled Note Book",
                    "Physics Record Book",
                    "Chemistry Record Book",
                    "Computer Science Record Book"
                ],
                "dispatchcount": 1,
                "totalDispatchValue": 2190,
                "totalDiscountValue": 0
            },
            {
                "_id": [
                    "PU2-Physics Part-1 Text Book",
                    "PU2-Physics Part-2 Text Book",
                    "PU2-Mathematics Part - 1 Text Book",
                    "PU2-Chemistry Part - 1 Text Book",
                    "PU2-English Text Book",
                    "PU2-Mathematics Part - 2 Text Book",
                    "PU2-Chemistry Part - 2 Text Book",
                    "PU2-English Work Book",
                    "PU2-TEXT BOOK",
                    "PU2-Sanskrit Text Book",
                    "Boys White & Blue Striped Half Shirt",
                    "Boys Navy Blue Regular Fit Trousers",
                    "Illume Calf-length Cotton Black Socks  "
                ],
                "dispatchcount": 1,
                "totalDispatchValue": 4131,
                "totalDiscountValue": 150
            },
            {
                "_id": [
                    "PU2-TEXT BOOK"
                ],
                "dispatchcount": 1,
                "totalDispatchValue": 1679,
                "totalDiscountValue": 0
            }
        ]

Здесь для ключа _id приходит несколько значений и некоторые из значений также повторяется в следующей записи.

Пн goose Модель:

const Model = new Schema({
        DispatchId: { type: Number, required: true },
        OrderNumber: { type: String, unique: true, required: true },
        OrderStatus: { type: String },
        OrderType: { type: String },        
        DispatchPriority: { type: String },

        Comments: { type: Array },
        Products: { type: Array },

        Customer: { type: Object },     
        TotalDiscount: { type: Object },
        TotalShipping: { type: Object },
        TotalCoupon: { type: Object },
        TotalAmount: { type: Object },
        PaymentDetails: { type: Object },
        ClientDetails: { type: Object },

        DispatchCreatedAt: { type: String },
        DispatchUpdatedAt: { type: String },

        IsActive: { type: Boolean }
    }, 
    {
        timestamps: { 
            createdAt: 'CreatedAt', 
            updatedAt: 'UpdatedAt' 
        },
        collection: DISPATCH_ORDERS_COLLECTION
    }
);

Здесь мне нужно вычислить total Payment and total Discount в соответствии с названием продукта. В моем случае один продукт также приходит два раза в двух записях.

1 Ответ

1 голос
/ 07 мая 2020

В ваших документах Products - это массив (может быть массив объектов с полем ProductName), когда вы выполняете "$Products.ProductName", он даст вам массив названий продуктов. Таким образом, $group должен группироваться по массивам с точно такими же элементами внутри них (даже несоответствие одного элемента между двумя массивами будет рассматриваться как два значения на _id на групповом этапе). Таким образом, вам нужно выполнить $unwind в массиве Products до этапа $group:

Некорректный запрос:

db.collection.aggregate([
  /** You don't need this addFields stage, just given to test, you can remove `$group` stage & check the `products` field value */
  {
    $addFields: {
      products: "$products.productName"
    }
  },
  {
    $group: {
      _id: "$products" // arrays
    }
  }
])

Тест: mongoplayground

Правильный запрос:

db.collection.aggregate([
  {
    $unwind: "$products"
  },
  {
    $addFields: {
      products: "$products.productName"
    }
  },
  {
    $group: {
      _id: "$products" // Single value
    }
  }
])

Тест: mongoplayground

Ссылка: $ размотать

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