Finding a MongoDB document through a word in a field description in each product with Mongoskin

老子叫甜甜 提交于 2020-01-04 13:37:57

问题


This is an example of document that I have in my MongoDB:

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

This search for "description" does not work (this is where I need help):

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

I need to find through a word, all the products that exist in the collection include in the description field that word.


回答1:


To find through a word, all the products that exist in the collection include in the description field that word, you need a regex match with case insensitivity. You could use the following query (as an example):

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

where the i in the /test/i indicates case insensitivity, thus the regex matches on the description field for any text with the string "test". The equivalent SQL expression follows:

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

So you could use the same in your route implementation, using the find() method to return all matched documents instead of the findOne() which returns just one document:

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

Another option is to use the $text operator in your find operation as it performs a text search on the content of the fields indexed with a text index. So the first thing you would do is create a text index on the description field:

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

After that you can query using the $text operator. For example, the following query searches for the term coffee:

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

EDIT:

All things being equal, you can then update your route implementation to use query strings in the URL instead:

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

which you can query in your browser as http://localhost/description?q=product



来源:https://stackoverflow.com/questions/29517065/finding-a-mongodb-document-through-a-word-in-a-field-description-in-each-product

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!