Javascript 无法处理来自MongoDB的数据
假设我有一个模式:Model1.js:Javascript 无法处理来自MongoDB的数据,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,假设我有一个模式:Model1.js: const mongoose = require('mongoose'); const bookSchema = mongoose.Schema({ someDate: { type: Date }, }) 基于此模式,我在mongoDB中将数据存储为: {[ "someDate" : ISODate("2021-02-16T06:42:52.652Z"), }] 当我尝试根据月份对其进行过滤时
const mongoose = require('mongoose');
const bookSchema = mongoose.Schema({
someDate: { type: Date },
})
基于此模式,我在mongoDB中将数据存储为:
{[
"someDate" : ISODate("2021-02-16T06:42:52.652Z"),
}]
当我尝试根据月份对其进行过滤时,结果如下:
const info = await Model1.aggregate([...some other matchning parameters,{ $project: { month: { $month: "$someDate" } } }]).exec();
//O/p: [{ month: 2 }]
现在假设我有另一个模式:Model2.js:
const mongoose = require('mongoose');
const desktop = mongoose.Schema({
details: [{
somAnotherDate: { type: Date },
}]
})
当我尝试过滤它时:
const info = await Model1.aggregate([...some other matchning parameters,{ $project: { month: {
$month: "$details[0].somAnotherDate" } } }]).exec();
// O/p: [{month: null }]
那么,是什么导致了问题,并且无法处理日期呢
两种情况下保存的日期类型也是相同的,因此是什么导致了问题。或者我在查询MongoDB时无法以这种方式获取值
我试过:
const info = await Model1.aggregate([...some other matchning parameters,{
$project: { month: $unwind:"$details", { $month: somAnotherDate" } } }]).exec();
但这是不允许的,因为这是抛出错误
请务必让我知道我可以应用的所有方法
编辑:
const mongoose = require('mongoose');
const desktop = mongoose.Schema({
details: [{
somAnotherDate: { type: Date },
}]
})
假设我将数据保存为
{details:[{"someDate" : ISODate("2021-02-16T06:42:52.652Z"),},
{"someDate" : ISODate("2021-03-16T06:42:52.652Z")}]}
根据@Cuong Le Ngoc提供的答案:
const info = await Model1.aggregate([
...some other matchning parameters,
{
$project: {
month: {
$month: { $arrayElemAt: ["$details.somAnotherDate", 0] }
}
}
}
]).exec();
我们可以通过以下方式获得o/p:
// O/p: [{month: 2 }]
但在这里,我们假设在细节数组中只有一个元素,但如果有多个元素呢。我如何使用提供的方法进行迭代,因为它只处理一个元素
预期o/p为:
O/p: [{month: 2 },{month: 3 }]
如果您需要更多详细信息,请告知我。在MongoDB中,您可以使用为文档中位于数组特定索引处的字段指定查询条件,如details.0。somAnotherDate
,但它在投影中不起作用,如前所述:
不能使用数组索引投影特定数组元素;e、 g.{“instock.0”:1}
投影将不会投影具有第一个元素的数组
要获取详细信息
中第一项的somAnotherDate
字段,可以使用。例如:
const info = await Model1.aggregate([
...some other matchning parameters,
{
$project: {
month: {
$month: { $arrayElemAt: ["$details.somAnotherDate", 0] }
}
}
}
]).exec();
更新:要获取详细信息
中每个项目的月份,您可以像使用Model1一样先使用project,然后使用project:
const info = await Model1.aggregate([
{ $unwind:"$details" },
{
$project: {
month: { $month: "$details.somAnotherDate" }
}
}
]).exec();