MongoDB / Mongoose模式。卡在文本索引上

时间:2018-07-25 11:56:30

标签: mongodb schema

我有这个模式

const productSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: { type: String, required: true },
    brand: { type: String, required: true },
    imageRoute: { type: String, required: true },
    description: { type: String, required: true },
    ingredients: { type: String, required: true },]
});

一个例子可能是:

{
    name: "Sugar Free Oreo",
    brand: "Oreo",
    imageRoute: "/path/to/image.jpg",
    description: "Yummy cookies",
    ingredients: "Maltitol, Wheat Flour, High Oleic Canola and/or Palm Oil, Cocoa , Salt"
}

我的目标是:

  • 按名称或品牌获取产品
  • 按名称或品牌以及包含或不包含的成分获取产品

我这样解决了第一点:

ProductModel.collection.createIndex(
    { name : 'text', brand : 'text' },
    function(error, res) {...}); 

Product.find( { $text: { $search: req.query.search } } )

我该如何解决第二点?我尝试过:

ProductModel.collection.createIndex(
    { name : 'text', brand : 'text', ingredients: 'text' },
    function(error, res) {...}); 

Product.find( { $text: { $search: req.query.search } } )

这样做我没有申请第一点,第二点不能正常工作。如果我搜索奥利奥(Oreo)并且排除了糖作为成分,则

Product.find( { $text: { $search: "Oreo -sugar" } } )

即使该产品成分中不含糖,该产品示例也不匹配,但其名称类似于“无糖奥利奥”。

我需要类似的东西:

ProductModel.collection.createIndex(
    { indexName: "nameOrBrandIndex", index: { name : 'text', brand : 'text' }},
    { indexName: "ingredientsIndex", index: { ingredients : 'text' }},
    function(error, res) {...}); 

//For the first point
Product.find( { $text: { $search: req.query.search, using: nameOrBrandIndex } } ) 

//For the second point
Product.find( { $text: { $search: req.query.search, using: nameOrBrandIndex },
              { $text: { $search: req.query.ingredientsRestrictions, using: ingredientsIndex} } )

有什么方法可以模拟吗?

谢谢你,抱歉我的写作,英语不是我的母语

0 个答案:

没有答案