gpt4 book ai didi

javascript - mongoose 检查 id 是否存在但该 id 嵌套在数组中

转载 作者:行者123 更新时间:2023-12-04 09:30:12 26 4
gpt4 key购买 nike

当我获取新警报时,我想检查是否已经记录了新警报的 ID。问题是该 ID 嵌套在数组中。有 alertsDetails 数组,其中包含对象,并且这些对象有一个 _ID 字段,这是我想要检查的内容。我不确定如何实现这一目标。我得到了下面的代码,但随后我必须遍历结果以检查存在值。我相信一定有更好的方法。

const mongoose = require('mongoose');

const { Schema } = mongoose;

const G2AlertsSchema = new Schema(
{
status: { type: String, required: true },
openDate: { type: Date, required: true },
alertType: { type: Array, required: true },
severity: { type: Array, required: true },
locationName: { type: Array, required: true },
history: { type: Array, required: true },
alertDetails: { type: Array, required: false },
assignedTo: { type: Schema.Types.ObjectId, ref: 'user' },
},
{
timestamps: true,
},
);

const G2Alerts = mongoose.model('G2Alert', G2AlertsSchema);

module.exports = G2Alerts;
这是我在 mongodb 网站上找到的代码。我只想看看ID是否只存在。基本上,当我获取新警报时,我得到一个数组并对其进行迭代,我想根据数据库中的内容检查每个项目的 ID。如果它在那里,跳过并转到下一个。如果它是新的,则创建一个新警报并保存它。
 const exists = await G2Alerts.aggregate([
{
$project: {
exists: {
$in: ['5f0b4f508bda3805754ab343', '$alertDetails._id'],
},
},
},
]);
编辑:另一件事。我收到一个 eslint 警告,说我应该使用数组迭代而不是 for 循环。问题是,我需要在查找警报 ID 时使用 await。如果我使用,减少或过滤,我不能使用等待。如果我在 reduce 或 filter 函数中使用 async ,那么它将返回 promises 或只是一个空数组。
根据 提供的答案,以下内容有效Tom Slabbaert
  const newAlertsData = [];

for (let item of alertData.data.items) {
const exists = await G2Alerts.find({ 'alertDetails._id': `${item._id}` });
if (exists.length === 0) {
newAlertsData.push(item);
}
}

if (newAlertsData.length !== 0) {......
但这不
  const filteredAlerts = alertData.data.items.reduce((filtered, item) => {
const exists = await G2Alerts.find({ 'alertDetails._id': `${item._id}` });
if (exists.length === 0) {
filtered.push(item);
}
return filtered;
}, []);
enter image description here

最佳答案

你离得不远了,这是一个使用正确语法的例子:

const exists = await G2Alerts.findOne({"alertDetails._id": '5f0b4f508bda3805754ab343'}});
if (!exists) {
... do something
}
这也可以使用 aggregate 来实现与 $match舞台而不是 $project阶段甚至更好 countDocuments如果您不需要它,它只会返回计数而不是整个对象。
我想补充的另一件事是确保 alertDetails._idstring输入时使用 string在你 $in .否则你需要将它们转换为 ObjectId像这样输入 Mongoose :
new mongoose.Types.ObjectId('5f0b4f508bda3805754ab343')
对于 Mongo:
import {ObjectId} from "mongodb"
...


new ObjectId('5f0b4f508bda3805754ab343')

编辑
尝试这样的事情?
let ids = alertData.data.items.map(item => item._id.toString());
let existing = await G2Alerts.distinct("alertsDetails._id", {"alertsDetails._id": {$in: ids}});

const filteredAlerts = alertData.data.items.reduce((filtered, item) => {
if (!existing.includes(item._id.toString())) {
return [item].concat(filtered)
}
return filtered;
}, []);
这样你只需要调用数据库一次而不是多次。
基于提供的答案的最终代码。
  const ids = alertData.data.items.map(item => item._id);
const existing = await G2Alerts.find({ 'alertDetails._id': { $in: ids } }).distinct(
'alertDetails._id',
(err, alerts) => {
if (err) {
res.send(err);
}
return alerts;
},
);

const filteredAlerts = alertData.data.items.reduce((filtered, item) => {
if (!existing.includes(item._id.toString()) && item.openDate > dateLimit) {
return [item].concat(filtered);
}
return filtered;
}, []);

关于javascript - mongoose 检查 id 是否存在但该 id 嵌套在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62878106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com