MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDb $addFields et $match

La prochaine fois, veuillez ajouter un échantillon de votre document afin que les gens puissent reproduire votre problème. Cela dit, je ne vois pas où est ton problème. J'ai créé des données pour reproduire votre cas d'utilisation. J'ai donc ajouté le document suivant :

{ 
    "_id" : ObjectId("5a0d5d376c9b762a7c035ec4"), 
    "projectName" : "some stack test", 
    "price" : NumberInt(45), 
    "propertyId" : {
        "prefix" : "a", 
        "number" : "7"
    }
}

Ensuite j'ai exécuté votre script (sans le tri) et ça marche bien :

db.yourCollectionName.aggregate([
    {
        $project: {
            "projectName": 1,
            "price": 1,
            "document": '$$ROOT'
        }
    },
    {
        $addFields: {
            "document.id": {
                $concat: ['$document.propertyId.prefix', '$document.propertyId.number']
            }
        }
    },
    {
        $match: {
            $and: [{
                $or: [{
                        "projectName": {
                            $regex: '.*' + "some stack test"
                        }
                    },

                    {
                        "document.id": {
                            $regex: '.*' + "a" + '.*',
                            $options: "7"
                        }
                    }
                ]
            }]

        }
    },
    {
        $replaceRoot: {
            newRoot: "$document"
        }
    }
])

Le fait que vous n'obteniez aucun résultat est probablement dû aux paramètres de votre requête. De plus, comment le "projectName" peut-il avoir les mêmes paramètres de recherche que votre "document.id" Est-ce qu'ils correspondent ?Vérifiez à nouveau votre pipeline de correspondance :

{"projectName": {$regex: '.*' + req.query.search + '.*', $options: "i"}},       
{'document.id': {$regex: '.*' + req.query.search + '.*', $options: "i"}}