为了账号安全,请及时绑定邮箱和手机立即绑定

检查数组值,如果存在于 mongodb 集合中,则推送到新数组中

检查数组值,如果存在于 mongodb 集合中,则推送到新数组中

胡说叔叔 2023-12-14 16:41:48
我直接连接到 mongodb 并使用 mongoose 连接,mongoose db 文件通过调用dbConnect(),并且我的查询工作正常。问题在于我稍后添加的标准数据库连接 ( const { db } = await connectToDatabase();) 来查询我无法将其转换为可接受的猫鼬模式的集合。我的代码在顶部:import { connectToDatabase } from "../../utils/mongodb"import dbConnect from '../../utils/dbConnect'dbConnect();export default async (req, res) => {  const { db } = await connectToDatabase();  try{ ...data我从 API 中获取一些数据,我需要迭代这个data.titles 并在 mongodb 集合“channels”(字段为“name”)中执行 a 操作find(),以便仅保留那些与集合项的字段名称匹配的 data.title s我尝试的是这样的:        var token = `https://www.googleapis.com/youtube/v3/subscriptions?part=snippet%2CcontentDetails&mine=true&maxResults=50&key=${process.env.GOOGLE_API_KEY}&access_token=${token}`;        token = token.replace(/"/g, '');        var url = await fetch(token);        const subsData = await url.json();        //* Save all followed channels names, imgs and ids in arrays        var subsArray = [], idsArray = [], imgsArray = [];        for(let i=0; i < subsData.items.length; i++){          //* check the channel's name is in database          // if ( Chann.findOne({ "name" : subsData.items[i].snippet.title }) ) {          if ( db.channels.find({ name: subsData.items[i].snippet.title }) != null ) {            idsArray.push(subsData.items[i].snippet.resourceId.channelId);            subsArray.push(subsData.items[i].snippet.title);            imgsArray.push(subsData.items[i].snippet.thumbnails.default.url);          }        }但它抛出:TypeError: Cannot read property 'find' of undefined正如您从代码中看到的,我也尝试使用 mongoose 代替,两者都在我的项目中配置,但使用 mongoose 模式它什么也没做,就好像它findOne总是正确的一样。所以它没有抛出任何错误,但基本上不起作用,数组中的所有通道都被接受。我想知道这是否是由于模式之间的不完美匹配而发生的,因为我从已经存在的 mongodb 数据手动重新创建了模式“Chann”,而且我不能 100% 确定我到处正确地编写了数组的对象。
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

db.channels.find({ name: subsData.items[i].snippet.title }) != null

这不会按照您使用的方式工作。

db.channels.find({ name: subsData.items[i].snippet.title })

返回一个Promise永远不会是的null

相反,你会想做类似的事情

const result = await db.channels.find({ name: subsData.items[i].snippet.title })if(!result.length) {
   ...
}

您可以使用回调、Promises 或 async/await 来等待数据库结果,我的示例正在使用,async/await但有一些选项。


查看完整回答
反对 回复 2023-12-14
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

首先检查——


if(subsData.items[i].snippet.title!= undefined && subsData.items[i].snippet.title!= null){

    // ....

}else{

    console.log(...);

}


查看完整回答
反对 回复 2023-12-14
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信