通过Mongoskin的每个产品的字段描述中的一个单词来查找MongoDB文档



这是我的MongoDB中的一个文档示例:

{
    "_id": ObjectId('5525039895884d66710d0fc3'),
    "prid": "63527",
    "data": {
        "sku": "HF22-81639",
        "name": "Product Test",
        "ean": "8763900872512",
        "description": "This product is my first test",
    }
}

搜索"描述"不起作用(这是我需要帮助的地方):

app.get("/description/:id", auth, function(req, res, next) {
    req.collection.findOne({
        "data.description": req.params.id
    }, function(e, result) {
        if(e) return next(e);
        res.send(result);
    });
});

我需要通过一个词找到,集合中存在的所有产品都包含在描述字段中的那个词。

要查找一个单词,集合中存在的所有产品都包含在该单词的描述字段中,您需要一个不区分大小写的regex匹配。您可以使用以下查询(作为示例):

db.product.find({"data.description": /test/i});

其中/test/i中的i表示不区分大小写,因此正则表达式在具有字符串"test"的任何文本的描述字段上匹配。等效的SQL表达式如下:

select * from product where description like '%test%'

因此,您可以在路由实现中使用相同的方法,使用find()方法返回所有匹配的文档,而不是使用findOne()只返回一个文档:

app.get("/description/:id", auth, function(req, res, next) {
    req.collection.find({
        "data.description": /req.params.id/i
    }, function(e, result) {
        if(e) return next(e);
        res.send(result);
    });
});

另一个选项是在查找操作中使用$text运算符,因为它对使用文本索引编制索引的字段的内容执行文本搜索。因此,您要做的第一件事是在描述字段上创建一个文本索引:

db.collection.createIndex( { "data.description": "text" } )

之后,您可以使用$text运算符进行查询。例如,以下查询搜索术语咖啡:

db.collection.find( { $text: { $search: "coffee" } } )

编辑

在所有条件相同的情况下,您可以更新您的路由实现,以使用URL中的查询字符串:

app.get("/description", auth, function(req, res, next) {
    req.collection.find({
        $text: { $search: req.params.q }
    }, function(e, result) {
        if(e) return next(e);
        res.send(result);
    });
});

您可以在浏览器中查询为http://localhost/description?q=product

最新更新