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

Posted

技术标签:

【中文标题】如何仅使用一个关键字搜索 MongoDB 集合中的所有键【英文标题】:How to search all keys inside MongoDB collection using only one keyword 【发布时间】:2017-05-16 10:56:44 【问题描述】:

有没有办法让 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: 代码:

客户端控制器

// 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 和 digit 的提示,终于解决了这个问题。这是我的解决方案,以防其他人遇到与我相同的问题:

客户端控制器

$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);
    )

感谢大家的帮助。 :)

【问题讨论】:

顺便说一句,我认为您想要 req.params.param 而不是 req.body 作为您的搜索值。 感谢您的回复。是的,这也是我的错误之一。 :)) 更正它使我的搜索功能完美运行。 【参考方案1】:

如果你想搜索所有键,那么你可以使用

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

然后搜索

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

【讨论】:

这对我有用,但我必须像这样创建索引:schema.index(name: "text", description: "text");。现在我只需要考虑不区分大小写的正则表达式。谢谢! P.S. 原来这也解决了不区分大小写的搜索。一石两鸟!你是救生员。谢谢!【参考方案2】:

您可以尝试创建一个索引:

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

然后通过搜索值,示例:

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

【讨论】:

感谢您的回复。这是我第一次看到createIndex。它有什么作用? Product.find($text:$search: 'Chocolate',productName:1, productType:1); 是否意味着无论键名如何,它都会返回所有匹配的记录? 嗨.. 索引以升序 (1) 或降序 (-1) 排序顺序存储对字段的引用。正如我上面的示例是存储对该字段的引用的复合索引。创建索引后,您可以在查询中使用它。

以上是关于如何仅使用一个关键字搜索 MongoDB 集合中的所有键的主要内容,如果未能解决你的问题,请参考以下文章

什么是全文搜索的正确 mongodb 集合结构?

MongoDB:用于搜索性能的嵌套值与单独的集合 - 数据库模式设计

MongoDB:如何将仅出现在 $project 中的字段相乘?

如何使用 mongoDb 在单词序列集合中搜索输入单词

仅检索 MongoDB 集合中对象数组中的查询元素

仅检索 MongoDB 集合中对象数组中的查询元素