如何仅使用一个关键字搜索MongoDB集合中的所有键

时间:2017-01-02 10:29:19

标签: javascript mongodb mongoose mean-stack

MongoDB是否有办法仅使用一个搜索关键字搜索整个集合的密钥内容?

假设我有以下集合(让我们称之为foodCollection):

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

我希望我的搜索能够找到包含“Chocolate”的匹配,这意味着它应该返回“Chocolate Mousse Cake”和“Dark Ba​​r”。

我正在尝试使用ff:code:

执行此操作

客户端控制器

// 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

服务器端控制器(我使用了MongoDB文档中的this reference):

// 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);
    });
}

当我执行此操作时,我什么也没得到。我错过了什么吗?

非常感谢任何帮助。谢谢。

更新(最终)

最后通过Joydip和数字的提示解决了这个问题。这是我的解决方案,以防其他人遇到与我相同的问题:

客户端控制器

$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架构

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"});

服务器端控制器

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

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

谢谢大家的帮助。 :)

2 个答案:

答案 0 :(得分:2)

您可以尝试创建索引:

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

然后通过搜索值,例如:

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

答案 1 :(得分:1)

如果要搜索所有密钥,则可以使用

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

然后按

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