sql >> Database >  >> NoSQL >> MongoDB

Mongodb opzoekarray van elementen met gecombineerd resultaat

U moet die toewijzing buiten $lookup uitvoeren door $map uit te voeren samen met $arrayElemAt om een ​​enkel paar van beide arrays te krijgen en vervolgens $mergeObjects om één object als resultaat te krijgen:

db.Order.aggregate([
    {
        $lookup: {
            from: "products",
            localField: "context.products.id",
            foreignField: "_id",
            as: "productDetails"
        }
    },
    {
        $addFields: {
            productDetails: {
                $map: {
                    input: "$productDetails",
                    in: {
                        _id: "$$this._id",
                        name: "$$this.context.name"
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 1,
            "context.products": {
                $map: {
                    input: "$context.products",
                    as: "prod",
                    in: {
                        $mergeObjects: [
                            "$$prod",
                            { $arrayElemAt: [ { $filter: { input: "$productDetails", cond: { $eq: [ "$$this._id", "$$prod.id" ] } } }, 0 ] }
                        ]
                    }
                }
            }
        }
    }
])

Mongo-speeltuin

Het doel van de laatste stap is om twee arrays te nemen:products en productDetails (de uitvoer van $lookup ) en zoek overeenkomsten tussen hen. We weten dat er altijd één match is, dus we kunnen maar één item krijgen $arrayElemAt 0 . Als uitvoer van $map er zal een enkele array zijn met "samengevoegde" documenten.




  1. Hoe TypeError op te lossen:callback.apply is geen functie?

  2. mongorestore willekeurige crash (fatale fout)

  3. Hoe mangoeste te onderscheiden, over te slaan en samen te beperken?

  4. Wat zijn de gevolgen van het uitschakelen van roddels, vermenging en hartslag voor selderijwerkers?