Node.js 在mongodb中使用对象数组检查字符串值数组
我有这样的字符串数组Node.js 在mongodb中使用对象数组检查字符串值数组,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我有这样的字符串数组 let fromHour = ['2.5','3','3.5'] let toHour = ['2.5','3','3.5'] 我在mongoDB中保存了一个对象数组 timeRange = [ { from:'2.5', to:'3' }, { from:'3',
let fromHour = ['2.5','3','3.5']
let toHour = ['2.5','3','3.5']
我在mongoDB中保存了一个对象数组
timeRange = [
{
from:'2.5',
to:'3'
},
{
from:'3',
to:'3.5'
}
]
我想检查我的字符串值数组是否存在于该对象值中
我已尝试此操作,但它给了我此错误(无法识别的表达式“$match”)
我也尝试过这个解决方案,它对我来说很有效,但它需要很多时间,所以我正在尝试使用聚合
checkAppoint = await Appointment.findOne({
date: myScheduleFinal[k].date,
status: { $in: ['pending', 'on-going'] },
timeRange:{$elemMatch:{
from:{$in:fromHolder},
to:{$in:toHolder}
}}
});
因此,任何人都可以解决这个问题,只要尝试一下
$elemMatch
和$in
操作符
- 使用
方法find()
- 使用
方法aggregate()
因此,我找到了解决此问题的方法,我将与大家分享我使用的解决方案 首先,我想尽量减少我对mongodb的请求,所以我现在只提出一个请求,将所有的约会都带到所需的日期 我想这样做,因为我的fromHour和toHour数组将通过单个请求多次更改 helperArray=>包含我想要检查其范围的所有日期
let checkAppoint = await Appointment.find({
date: { $in: helperArray },
status: { $in: ['pending', 'on-going'] },
});
现在,在for循环中,我将遍历这些数据
checkAppoint.filter((singleAppoint) => {
if (singleAppoint._doc.date === myScheduleFinal[k].date) {
singleAppoint._doc.timeRange.map((singleTime) => {
if (fromHolder.includes(singleTime.from)) {
busy = true;
}
});
}
});
它可以工作,但仍然需要很多时间您是否有另一种解决方案可以快速完成这项工作可能需要时间,因为它正在迭代数组元素到数组元素的匹配,请尝试在from和to字段上提供复合多键索引,如下所示
db.collectionName.createIndex({“timeRange.from”:1,“timeRange.to”:1})
更多信息请参见我找到了解决方法,我现在可以一次完成特定日期的所有约会,然后再进行此elemMatch检查,这给了我一个比不断请求数据库检查更快的速度,因为在我的for循环中,从小时到小时的值将不止一次地改变@turivishalook很好,我很高兴你已经解决了,你可以将你的解决方案作为答案发布,如果你认为这有帮助,那么这个答案。
checkAppoint = await Appointment.aggregate([
{
$match: {
timeRange: {
$elemMatch: {
from: { $in: fromHour },
to: { $in: toHour }
}
}
}
}
])
let checkAppoint = await Appointment.find({
date: { $in: helperArray },
status: { $in: ['pending', 'on-going'] },
});
checkAppoint.filter((singleAppoint) => {
if (singleAppoint._doc.date === myScheduleFinal[k].date) {
singleAppoint._doc.timeRange.map((singleTime) => {
if (fromHolder.includes(singleTime.from)) {
busy = true;
}
});
}
});