gpt4 book ai didi

node.js - 在数组中的对象中按日期搜索

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:51 26 4
gpt4 key购买 nike

我有以下 Mongoose 架构:

let ExerciserSchema = new Schema({
username: {
type: String,
required: true
},
exercises: [{
desc: String,
duration: Number,
date: {
type: Date,
default: new Date()
}
}]
});

我想按用户名搜索并将练习结果限制在某个日期范围内。

我尝试了这个查找功能:

let user = await Exerciser.find(
{ "username": name },
{ "exercises.date": { "$gte": from }},
{ "exercises.date": { "$lte": to }}
).exec((err, data) => {
if (err) {
res.json({ Error: "Data not found" })
return done(err);
}
else {
res.json(data);
return done(null, data);
}
});

但是,它记录错误并且不返回数据。MongoError:不支持的投影选项:exercise.date:{ $gte:新日期(1526342400000)}

我从该错误中意识到,似乎正在以毫秒为单位搜索我的日期,但在运行上述函数之前我 console.log 它处于日期模式,这就是我想要的:2018-05-01T00:00:00.000Z

如何才能完成这项工作,以便我可以根据给定架构的日期范围进行搜索?如有必要,我可以更改架构中日期的格式。我只想要最简单的解决方案。感谢您的帮助。

最佳答案

您的查询有误。您试图编写 AND 条件,但您将文档分开,而不是将所有内容放入一个文档中。这意味着 Model.find() 的“第二个”参数被解释为“场的投影”,因此出现错误:

MongoError: Unsupported projection option:

所以这不是“架构问题”,而是您向 Model.find() 发送了错误的参数。方法

您还需要$elemMatch对于数组中元素的多个条件:

// Use a try..catch block with async/await of Promises
try {
let user = await Exerciser.find({
"username": name,
"exercises": {
"$elemMatch": { "date": { "$gte": from, "$lte": to } }
}
});
// work with user
} catch(e) {
// handle any errors
}

最重要的是,您不需要等待回调。您可以像我在此处所示的那样 await Promise,或者只是传入 callback。两者都不是。

Exerciser.find({
"username": name,
"exercises": {
"$elemMatch": { "date": { "$gte": from, "$lte": to } }
}
}).exec((err,user) => {
// the rest
})
<小时/>

仅供引用,您尝试做的是:

Exerciser.find({
"$and": [
{ "username": name },
{ "exercises.date": { "$gte": from }},
{ "exercises.date": { "$lte": to }}
]
)

但这实际上仍然是不正确的,因为没有 $elemMatch $gte$lte 适用于数组的所有元素,而不仅仅是单个元素。因此,如果任何数组项小于日期但不一定大于日期,则会显示不正确的结果。

对于数组元素 $elemMatch强制执行两个条件的“之间”。

关于node.js - 在数组中的对象中按日期搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359297/

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