Как найти документы MongoDB только со значением? - PullRequest
1 голос
/ 10 марта 2020
{
    "name"    : "Apple",
    "partner" : "Samsung-Sony" 
}
{
    "name"    : "Samsung",
    "partner" : "Google-LG"
}
{
    "name"    : "McDonald",
    "partner" : "Burgerking"
}

Если у меня есть вышеупомянутая структура данных, как я могу найти документы, которые имеют значение Samsung? В этом примере это должно быть возвращено

{
    "name"    : "Apple",
    "partner" : "Samsung-Sony" 
}
{
    "name"    : "Samsung",
    "partner" : "Google-LG"
}

Поскольку во-первых, оно имеет Samsung в partner имени поля, а во-вторых, оно имеет Samsung в name поле. Я хочу найти документы без указания c имени поля. Как его найти?

Я красный ( запрос mongodb без имени поля ) вопрос, но это вопрос 7 лет, поэтому я пишу это.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы можете использовать текстовый поиск , создав текстовый индекс .

Допустим, у вас есть образец схемы продукта:

const mongoose = require("mongoose");

const productSchema = new mongoose.Schema({
  name: String,
  partner: String
});

const Product = mongoose.model("Product", productSchema);

module.exports = Product;

И эти документы в коллекции продуктов.

{
    "_id" : ObjectId("5e67e98e41b119430816c779"),
    "name" : "McDonald",
    "partner" : "Burgerking"
},
{
    "_id" : ObjectId("5e67e98241b119430816c778"),
    "name" : "Samsung",
    "partner" : "Google-LG"
},
{
    "_id" : ObjectId("5e67e97541b119430816c777"),
    "name" : "Apple",
    "partner" : "Samsung-Sony"
}

Сначала мы создадим индекс по полям, которые мы хотим искать в коллекции продуктов, используя оболочку mongodb или gui, например MongoDB Atlas.

db.products.createIndex(
   {
     name: "text",
     partner: "text"
   }
 )

Теперь мы можем искать по такому термину:

const Product = require("../models/product"); 

router.get("/products", async (req, res) => {
  const result = await Product.find(
    { $text: { $search: req.query.term } },
    { score: { $meta: "textScore" } }
  ).sort({ score: { $meta: "textScore" } });

  res.send(result);
});

Когда мы отправляем поисковый запрос в строке запроса так: http://.../products?term=Samsung

Результат будет таким:

[
    {
        "_id": "5e67e98241b119430816c778",
        "name": "Samsung",
        "partner": "Google-LG",
        "__v": 0,
        "score": 1.1
    },
    {
        "_id": "5e67e97541b119430816c777",
        "name": "Apple",
        "partner": "Samsung-Sony",
        "__v": 0,
        "score": 0.75
    }
]
1 голос
/ 10 марта 2020

Вы можете использовать $ indexOfBytes для обработки части "содержит", и ее следует использовать как часть $ expr :

{ $expr: { $or: [ { $ne: [ { $indexOfBytes: [ "$partner", "Samsung" ] }, -1 ] }, { $eq: [ "$name", "Samsung" ] } ] } }

Пн go детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...