Tengo en la base de datos la siguiente matriz de objetos.
[ { price: "1" type: "buy", }, { price: "2" type: "buy", }, { price: "3" type: "sell" }, { price: "4" type: "sell" } ]¿Cómo puedo hacer una agregación para obtener una matriz de matrices con todas las combinaciones posibles (el precio podría ser un número aleatorio)
ocultar artículos con el precio de compra más alto
y ordénelos, de modo que los artículos con la mayor diferencia de precio estén en la parte superior
[ [ { price: "1" type: "buy", }, { price: "4" type: "sell" } ], [ { price: "1" type: "buy", }, { price: "3" type: "sell" }, ], [ { price: "2" type: "buy", }, { price: "4" type: "sell" } ], [ { price: "2" type: "buy", }, { price: "3" type: "sell" }, ], ]Consulta
*No estoy seguro de que haga todo lo que necesita, porque no entendí la parte hide items with the highest buy price de compra más alto es "2" y en sus resultados tiene estos artículos
coll.aggregate( [{"$lookup": {"from": "coll", "pipeline": [{"$match": {"$expr": {"$ne": ["$$id", "$_id"]}}}, {"$project": {"_id": 0, "price": 1, "type": 1}}], "as": "pairs", "let": {"id": "$_id"}}}, {"$project": {"_id": 0, "pairs": {"$map": {"input": "$pairs", "in": {"$cond": [{"$gt": ["$$this.price", "$price"]}, [{"price": "$price", "type": "$type"}, "$$this"], ["$$this", {"price": "$price", "type": "$type"}]]}}}}}, {"$unwind": "$pairs"}, {"$group": {"_id": "$pairs"}}, {"$project": {"_id": 0, "pair": "$_id"}}, {"$set": {"priceDifference": {"$abs": {"$subtract": [{"$toDouble": {"$getField": {"field": "price", "input": {"$arrayElemAt": ["$pairs", 0]}}}}, {"$toDouble": {"$getField": {"field": "price", "input": {"$arrayElemAt": ["$pairs", 1]}}}}]}}}}, {"$sort": {"priceDifference": -1}}, {"$unset": ["priceDifference"]}])