Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Mongodb 在日期之间从子文档获取数据_Mongodb - Fatal编程技术网

Mongodb 在日期之间从子文档获取数据

Mongodb 在日期之间从子文档获取数据,mongodb,Mongodb,我试图从我的文档中获取一定数量的历史数据,类似于SQL的Between子句。我搜索了类似的问题并设法找到了这个查询,但它只返回数组的第一个元素,所以这还不够: db.docs.find({ _id: "eraj4983tj3" }, {history: { $elemMatch : {time: {$gt: new ISODate("2016-03-21T20:53:33.662Z") , $lt: new ISODate("2016-03-21T20:54:20.313Z") } } } })

我试图从我的文档中获取一定数量的历史数据,类似于SQL的Between子句。我搜索了类似的问题并设法找到了这个查询,但它只返回数组的第一个元素,所以这还不够:

db.docs.find({ _id: "eraj4983tj3" }, {history: { $elemMatch : {time: {$gt: new ISODate("2016-03-21T20:53:33.662Z") , $lt: new ISODate("2016-03-21T20:54:20.313Z") } } } });
我的文档如下所示:

{
    "_id": "eraj4983tj3",
    "descr": "somestuff",
    "history": [
        {
            "time": ISODate("2016-03-21T20:52:31.389Z"),
            "value": 103.91
        },
        {
            "time": ISODate("2016-03-21T20:53:33.663Z"),
            "value": 106.91
        },
        {
            "time": ISODate("2016-03-21T20:53:45.179Z"),
            "value": 104.91
        },
        {
            "time": ISODate("2016-03-21T20:54:20.313Z"),
            "value": 105.11
        },
        {
            "time": ISODate("2016-03-21T20:54:53.649Z"),
            "value": 105.41
        },
        {
            "time": ISODate("2016-03-21T20:55:12.998Z"),
            "value": 115.91
        }
    ]
}
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:52:31.389Z"), "value" : 103.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:20.313Z"), "value" : 105.11 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:53.649Z"), "value" : 105.41 } }
{ "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:55:12.998Z"), "value" : 115.91 } }
我的查询结果应返回以下内容:

{
    "_id": "eraj4983tj3",
    "history": [
        {
            "time": ISODate("2016-03-21T20:53:45.179Z"),
            "value": 104.91
        },
        {
            "time": ISODate("2016-03-21T20:54:20.313Z"),
            "value": 105.11
        },
        {
            "time": ISODate("2016-03-21T20:54:53.649Z"),
            "value": 105.41
        }
    ]
}

如何编写查询以获得此结果?

位置运算符
$
elemMatch
将只返回一个子文档。

位置运算符
$
elemMatch
将只返回一个子文档。

简单的查询无法实现您想要的结果。但是,您可以使用聚合:

db.yourColl.aggregate([
    { $match:{ _id:"eraj4983tj3" } },
    { $unwind: "$history" },
    { $match:{ "history.time":{
        $gt: new ISODate("2016-03-21T20:53:33.662Z") ,
        $lt: new ISODate("2016-03-21T20:54:20.313Z")
    }}},
    { $group:{ _id:"$_id", history:{ $push:"$history" }}}
])
这会给你正确的结果

{
  "_id" : "eraj4983tj3",
  "history" : [
      { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 },
      { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 }
  ]
}
现在,让我们检查一下各个阶段:

  • :查找正确的文档
  • 为每个数组项创建一个新文档,并通过管道发送。 此阶段的输出如下所示:

    {
        "_id": "eraj4983tj3",
        "descr": "somestuff",
        "history": [
            {
                "time": ISODate("2016-03-21T20:52:31.389Z"),
                "value": 103.91
            },
            {
                "time": ISODate("2016-03-21T20:53:33.663Z"),
                "value": 106.91
            },
            {
                "time": ISODate("2016-03-21T20:53:45.179Z"),
                "value": 104.91
            },
            {
                "time": ISODate("2016-03-21T20:54:20.313Z"),
                "value": 105.11
            },
            {
                "time": ISODate("2016-03-21T20:54:53.649Z"),
                "value": 105.41
            },
            {
                "time": ISODate("2016-03-21T20:55:12.998Z"),
                "value": 115.91
            }
        ]
    }
    
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:52:31.389Z"), "value" : 103.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:20.313Z"), "value" : 105.11 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:53.649Z"), "value" : 105.41 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:55:12.998Z"), "value" : 115.91 } }
    
  • 我们再次匹配,以查找上面阶段中与日期范围匹配的历史项目。此阶段的输出如下所示:

    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
    
  • 我们根据
    \u id
    (此处无新内容)进行分组,对于上述阶段输出的每个文档,我们将
    历史记录的值(对象)添加到新创建的分组文档中的数组
    历史记录中


  • 用一个简单的查询是不可能得到您想要的。但是,您可以使用聚合:

    db.yourColl.aggregate([
        { $match:{ _id:"eraj4983tj3" } },
        { $unwind: "$history" },
        { $match:{ "history.time":{
            $gt: new ISODate("2016-03-21T20:53:33.662Z") ,
            $lt: new ISODate("2016-03-21T20:54:20.313Z")
        }}},
        { $group:{ _id:"$_id", history:{ $push:"$history" }}}
    ])
    
    这会给你正确的结果

    {
      "_id" : "eraj4983tj3",
      "history" : [
          { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 },
          { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 }
      ]
    }
    
    现在,让我们检查一下各个阶段:

  • :查找正确的文档
  • 为每个数组项创建一个新文档,并通过管道发送。 此阶段的输出如下所示:

    {
        "_id": "eraj4983tj3",
        "descr": "somestuff",
        "history": [
            {
                "time": ISODate("2016-03-21T20:52:31.389Z"),
                "value": 103.91
            },
            {
                "time": ISODate("2016-03-21T20:53:33.663Z"),
                "value": 106.91
            },
            {
                "time": ISODate("2016-03-21T20:53:45.179Z"),
                "value": 104.91
            },
            {
                "time": ISODate("2016-03-21T20:54:20.313Z"),
                "value": 105.11
            },
            {
                "time": ISODate("2016-03-21T20:54:53.649Z"),
                "value": 105.41
            },
            {
                "time": ISODate("2016-03-21T20:55:12.998Z"),
                "value": 115.91
            }
        ]
    }
    
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:52:31.389Z"), "value" : 103.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:20.313Z"), "value" : 105.11 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:54:53.649Z"), "value" : 105.41 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:55:12.998Z"), "value" : 115.91 } }
    
  • 我们再次匹配,以查找上面阶段中与日期范围匹配的历史项目。此阶段的输出如下所示:

    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:33.663Z"), "value" : 106.91 } }
    { "_id" : "eraj4983tj3", "descr" : "somestuff", "history" : { "time" : ISODate("2016-03-21T20:53:45.179Z"), "value" : 104.91 } }
    
  • 我们根据
    \u id
    (此处无新内容)进行分组,对于上述阶段输出的每个文档,我们将
    历史记录的值(对象)添加到新创建的分组文档中的数组
    历史记录中


  • 您可以根据需要编写查询:数组没有保证的顺序。你的数据建模显然是错误的。我不是问订单,我只是需要两个日期之间的数据。见下文。另外,它是未定义的哪些潜在文档。你说它未定义是什么意思?我需要查询中指定id的文档中的数据。Undefined==可以是任意顺序。以
    [a,b,c,d]
    为例。根据许多因素,它可能以这种方式返回,也可能以
    [b,a,d,c]
    或任何其他顺序返回。您可以根据需要编写查询:数组没有保证的顺序。你的数据建模显然是错误的。我不是问订单,我只是需要两个日期之间的数据。见下文。另外,它是未定义的哪些潜在文档。你说它未定义是什么意思?我需要查询中指定id的文档中的数据。Undefined==可以是任意顺序。以
    [a,b,c,d]
    为例。根据许多因素,它可能以这种方式返回,也可能以
    [b,a,d,c]
    或任何其他顺序返回。该查询只返回一个时间-值对,如下所示:{“\u id”:“eraj4983tj3”,“history”:[{“time”:ISODate(“2016-03-21T20:53:33.663Z”),“value”:106.91},无论我在$gt和$lt运算符之间留有多长的时间。我需要接收日期之间的所有条目,而不仅仅是一个。很抱歉,这些运算符只返回一个。该查询只返回一个时间-值对,如:{“_id”:“eraj4983tj3”,“history”:[{“time”:ISODate(“2016-03-21T20:53:33.663Z”),“value”:106.91},无论我在$gt和$lt运算符之间留的时间有多长。我需要接收日期之间的所有条目,而不仅仅是一个。对不起,那些操作员只返回一个。