Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 4x 4x 14x 4x 4x 4x 4x 4x 4x 4x 4x | import idParser from "../../utilities/idParser.js";
import ProductsModel from "../../models/Products.js";
import productRatingPreparingStages from "../../utilities/productRatingPreparingStages.js";
import toObjectId from "../../utilities/toObjectId.js";
export default async function searchByIds(productsIds, projection, options) {
try {
const { withCount, withPrice } = options;
const ids = productsIds.map((product => toObjectId(idParser(product).id)))
const pipeline = [
{ $match: { _id: { $in: ids } } },
{ $project: projection },
...productRatingPreparingStages()
]
const addFieldsStage = {};
function getValueAt(ValueIndex) {
return {
$toDouble: {
$arrayElemAt: [
{
$split: [
{
$arrayElemAt: [
productsIds,
{ $indexOfArray: [ids, "$_id"] }
]
}
, "-"
]
},
ValueIndex
]
}
}
}
if (Boolean(withCount)) addFieldsStage.count = getValueAt(1);
if (Boolean(withPrice)) addFieldsStage.price = getValueAt(2);
(withCount || withPrice) && pipeline.push({ $addFields: addFieldsStage });
const products = await ProductsModel.aggregate(pipeline);
return products;
} catch (error) {
console.log(error)
return null;
}
}
|