如何在路由器文件中使用猫鼬集合
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 文件中呈现来自猫鼬的两个或多个填充集合