Dee J.
Dee J.

Reputation: 363

How to search all keys inside MongoDB collection using only one keyword

Is there a way for MongoDB to search an entire collection's keys' contents using only a single search keyword?

Suppose I have the following collection (let's call it foodCollection):

{    
    name: "Chocolate Mousse Cake", 
    type: "Cake" 
},
{
    name: "Mother's Cookies", 
    type: "Cookies" 
},
{
    name: "Dark Bar", 
    type: "Chocolate" 
}

I want my search to look for matches that contain "Chocolate", meaning it should return "Chocolate Mousse Cake" and "Dark Bar".

I'm trying to do this using the ff: code:

Client-side controller

// Search Products
$scope.searchProduct = function () {

    $http.get('/api/products/search/' + $scope.searchKeyword).success(function(data){
        console.log(data);
    })
    .error(function(err) {
        console.log("Search error: " + err);
    });
 }

Express.js

app.get('/api/products/search/:param', productController.search); // Search for product

Server-side controller (I used this reference from the MongoDB docs):

// Search
module.exports.search = function(req, res) {

    console.log("node search: " + req.body);

    Product.find({ $or: [{productName: req.body}, 
                         {productType: req.body}]
                 }, function(err, results) {
                        res.json(results);
    });
}

When I executed this, I got nothing. Am I missing something?

Any help would be greatly appreciated. Thank you.

UPDATE (FINAL)

Finally solved this thanks to Joydip's and digit's tips. Here's my solution in case somebody else gets the same problem as I did:

Client-side controller

$scope.searchProduct = function () {

    if ($scope.searchKeyword == '') {
        loadFromMongoDB();    // reloads original list if keyword is blank
    }
    else {
        $http.get('/api/products/search/' + $scope.searchKeyword).success(function(data){

            if (data.length === 0) {
                $scope.showNoRec = true; // my flag that triggers "No record found" message in UI
            }
            else {
                $scope.showNoRec = false;
                $scope.productList = data; // passes JSON search results to UI
            }
        });    
    }
}

Express.js

app.get('/api/products/search/:keyword', productController.search);   // Search for product

Mongoose schema

var mongoose = require('mongoose');

var schema = new mongoose.Schema({
    productName: String,
    productType: String,
    productMaker: String,
    productPrice: Number,
    createDate: Date,
    updateDate: Date
});
schema.index({productName: "text", productType: "text", productMaker: "text"});

Server-side controller

module.exports.search = function(req, res) {

    Product.find({$text: {$search : req.params.keyword}}, function(err, results){
        res.json(results);
    })
}

Thank you everyone for your help. :)

Upvotes: 0

Views: 88

Answers (2)

Joy
Joy

Reputation: 298

If you want to search all key, then you can use

db.foodCollection.createIndex( { name: "text", description: "text" } )

then search by

    db.foodCollection.find({ $text: { $search: "choco" } })

Upvotes: 1

digit
digit

Reputation: 4565

You can try by creating an Index:

db.yourollection.createIndex({"productName":1,"productType":1})

And then by searching for the value, Example:

Product.find({$text:{$search: 'Chocolate'}},{productName:1, productType:1});

Upvotes: 2

Related Questions