Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法处理来自MongoDB的数据_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript 无法处理来自MongoDB的数据

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"), }] 当我尝试根据月份对其进行过滤时

假设我有一个模式:Model1.js

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();