如何在路由器文件中使用猫鼬集合

Posted

技术标签:

【中文标题】如何在路由器文件中使用猫鼬集合【英文标题】:How to use mongoose collection in router file 【发布时间】:2021-09-07 23:01:01 【问题描述】:

我正在尝试将自动完成功能添加到我的 node/mongodb 项目中,并尝试按照本教程进行操作 (https://developer.mongodb.com/how-to/building-autocomplete-form-element-atlas-search-javascript/)。

我的 API 大致是这样设置的:

index.js
// Importing routes
const searchRoute = require("./Routes/search");

// Connect to DB
mongoose.connect(
  process.env.DB_CONNECT,
  
    dbName: "MyApp",
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
    useCreateIndex: true,
  
);
app.use("/api/test", searchRoute);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => 
  console.log(`Sever is running on port $PORT`);
);
Routes/search.js

router.get("/search", async (req, res) => 
  try 
    let result = await collection
      .aggregate([
        
          $search: 
            autocomplete: 
              query: `$req.body.query`,
              path: "name",
              fuzzy: 
                maxEdits: 2,
                prefixLength: 3,
              ,
            ,
          ,
        ,
      ])
      .toArray();
    res.send(result);
   catch (e) 
    res.status(500).send( message: e.message );
  
);

我知道这不起作用,因为我的搜索路线中的“集合”不是我需要的实际数据库集合,教程添加了collection = client.db("food").collection("recipes");,但我不知道如何传递这个集合(或像这样的集合) 到路由文件。我试过使用 module.exports,但它仍然说它是未定义的。我看到了这个类似的问题(Trying to get a list of collections from mongoose)但我只能得到它来导出信息(例如集合名称),即使我指定了集合名称,它仍然会出现'collection.aggregate is not a函数'

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

你可以试试:

import mongoose from 'mongoose';

...

router.get("/search", async (req, res) => 
  try 
    const collection = mongoose.connection.collection('<your-collection-name>');

    let result = await collection
    ...

【讨论】:

非常感谢。多么烦人的简单解决方案。快速的问题,因为我对业余编程很陌生,当我导入一些东西,即猫鼬时,我是否基本上得到了该模块以及我在其他文件中所做的所有更改,而不是模块的全新副本? 您将获得从该模块导出的任何内容。在这种情况下,猫鼬会保留一些内部“状态”(例如,您在 index.js 模块中由 mongoose.connect 初始化的连接),因此在您导入它时它变得可用。

以上是关于如何在路由器文件中使用猫鼬集合的主要内容,如果未能解决你的问题,请参考以下文章

EJS:如何在 EJS 文件中呈现来自猫鼬的两个或多个填充集合

如何在猫鼬的路由器中等待函数完成其所有内部表达式?

不将数据从服务方法传递到猫鼬获取路由以使用 Angular IO 查询数据

如何让猫鼬列出集合中的所有文档?判断集合是不是为空?

与填充一起使用时,猫鼬查询性能低下

猫鼬 - 如何仅验证特定字段?