给出一个mongoose 物体.如何在Document Object中执行全文搜索

 {
    "product" :[
        {
            "_id": "633d32c4ea9b06177e183388",
            "document": {
                "_id": "633d32c4ea9b06177e183388",
                "category": [
                    "62bacb137e6e0b6ac850b9ce",
                    "633d19260b72ba127d928e74"
                ],
                "name": "Iphone 13",
                "slug": "iphone-13",
                "__v": 0,
                "price": 2000.5,
                "images": [
                    {
                        "_id": "63cca1a271c3635246eee937",
                        "url": "https://res.cloudinary.com/..."
                    }
                ],
                "sold": 15,
                "ratings": []
            },
            "avgRating": null
        },
    ...

]


}

这就是我试过的方法,但不起作用

const product = await Product.aggregate([
  {
    $project: {
      document: "$$ROOT",
      avgRating: {
        $floor: { $avg: "$ratings.star" },
      },
    },
  },

  {
    $match: {
      document: { $text: { $search: `"${searchText}"` } },
    },
  },
]);

这是我的产品型号

const product = {
  name: {
    type: String,
    required: true,
    trim: true,
    minlength: [2, "Too short"],
    maxlength: [32, "Too long"],
    unique: true,
  },
  slug: {
    type: String,
    unique: true,
    lowercase: true,
    index: true,
  },
  category: [
    {
      type: ObjectId,
      ref: "Category",
    },
  ],
  description: {
    type: String,
    maxlength: 200,
  },
  price: {
    type: Number,
    required: true,
    trim: true,
    maxlength: 32,
  },
  shipping: {
    type: String,
    enum: ["Yes", "No"],
  },
  color: [
    {
      type: String,
      enum: ["Black", "Brown", "Silver", "White", "Blue"],
    },
  ],
  sold: {
    type: Number,
    default: 0,
  },
  quantity: {
    type: Number,
  },
  images: [
    {
      public_id: String,
      url: String,
    },
  ],
  ratings: [
    {
      star: Number,
      postedBy: {
        type: ObjectId,
        ref: "User",
      },
    },
  ],
};

我们的目标是通过获取产品评级的平均值来汇总产品评级,然后链接多个WHERE子句,其中一个WHERE子句是在文档对象中执行全文搜索.

敬请指教.

谢谢.

推荐答案

$text要求字段的分数为text index,其内容将被搜索.在您的例子中,您在文档上使用的是$text,而不是文本字段,因此它很可能会产生意外的结果.解决这个问题的一种方法是在模式中添加一个字段(假设是textContent),这是文档的字符串版本,然后在该字段上创建text index.所以你的管道会变成这样:

const product = await Product.aggregate([
  {
    $match: {
      textContent: { $text: { $search: `"${searchText}"` } },
    },
  },
  {
    $project: {
      avgRating: {
        $floor: { $avg: "$ratings.star" },
      },
    },
  },
]);

注意:我将$Match移到了上面,因为预计它将是管道的第一阶段.请参阅此处的$text个文档.

Node.js相关问答推荐

express返回意外的URL

Nestjs重写子类dto nodejs中的属性

为什么 Cors 在 NodeJS 中不起作用

Rest-Api动态图像路径和Express除非

try 使用 pdf.js 时 pdf.getPage 不是函数

node-gyp: "..\src\binding.cc: 没有这样的文件或目录"

当其中一个端点不工作时,如何使用 axios.all() 调用多个 API?

MongoDB Aggregate - 如何使用前一阶段的值作为下一阶段的字段名称?

在 React 和 Socket.io 中使用 Effect 钩子重新渲染两次

如何在不使用位置运算符 $ 的情况下更新 mongodb 文档中数组中的嵌套文档?

用户通过 oauth2 twitter 授权或通过Passport discord后如何重定向到 React/Vue 路由?

后端位于 Docker 容器中时的 SvelteKit SSR fetch()

如何promise AWS JavaScript 开发工具包?

如何正确使用 package.json 中的关键字属性?

我应该在(Docker)容器中使用 forever/pm2 吗?

所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

我可以在 Heroku 中运行咖啡脚本吗?

Meteor - collection.find() 总是返回所有字段

在 Node.js 中获取终端的宽度