繁体   English   中英

mongoDb查询应如何查找出现次数?

[英]What should be the mongoDb query to find number of occurrences?

collection样本记录,

(文件1)

[{
   "_id": ObjectId("567941aaf0058ed6755ab3dc"),
   "hash_count": NumberInt(7),
   "time": [
     NumberInt(1450787170),
     NumberInt(1450787292),
     NumberInt(1450787307),
     NumberInt(1450787333),
     NumberInt(1450787615) 
  ],
   "word": "batman" 
},

(文件2)

   {
       "_id": ObjectId("567941aaf0058ed6755ab3dc"),
       "hash_count": NumberInt(7),

   "time": [
     NumberInt(1450787170),
     NumberInt(1450787292),
     NumberInt(1450787307),
     NumberInt(1450787333),
     NumberInt(1450787354),
     NumberInt(1450787526),
     NumberInt(1450787615) 
  ],
   "word": "apple" 
}]

已经使用PHP存储了,我想找到在( 1450787307 )和( 1450787615 )之间的记录数

回答:

apple=5
batman=3 

应该查询什么?

我跑了这个命令

{
aggregate : "hashtags",       
pipeline:

[
{$match:{"time":{$gte:NumberInt(1450787307), $lte:NumberInt(1450787615)}}},
{$unwind:"$time"},
{$match:{"time":{$gte:NumberInt(1450787307), $lte:NumberInt(1450787615)}}},
{$group:{"_id":"$word","count":{$sum:1}}}
]

}

这给出了这个结果

Response from server:
{
   "result": [

  ],
   "ok": 1 
}

由于您坚持使用较旧的mongoDB版本,因此无法利用3.2引入的array aggregation operators

您必须汇总如下:

db.collection.aggregate([
{$match:{"time":{$gte:NumberInt(1450787307), $lte:NumberInt(1450787615)}}},
{$unwind:"$time"},
{$match:{"time":{$gte:NumberInt(1450787307), $lte:NumberInt(1450787615)}}},
{$group:{"_id":"$word","count":{$sum:1}}}
])

翻译成PHP

$result = $c->aggregate([
[ '$match' => [ 'time' => [ '$gte' => NumberInt(1450787307), 
                            '$lte' => NumberInt(1450787615) ] ] ],
[ '$unwind' => '$time' ],
[ '$match' => [ 'time' => [ '$gte' => NumberInt(1450787307), 
                            '$lte' => NumberInt(1450787615) ] ] ],
[ '$group' => [ '_id' => '$word', 'count' => [ '$sum' => 1 ] ] ]
]);

3.2版中,您可以结合使用$filter$size来达到相同的结果,并且操作成本更低。

db.collection.aggregate([
{$match:{"time":{$gte:NumberInt(1450787307), 
                 $lte:NumberInt(1450787615)}}},
{$project:{"_id":0,"word":1,
           "count":{$size:{$filter:
                               {"input":"$time",
                                "as":"t",
                                "cond":{$and:[
                                     {$gte:["$$t",NumberInt(1450787307)]},
                                     {$lte:["$$t",NumberInt(1450787615)]}]}
                                }
                           }
                    }
}}
])

好的,尝试了很多之后,我得到了这个答案,并且对于1450787615-下限1450855155-上限是正确的

db.hashtags.aggregate([
    {
        "$match": {
            "time": {
                "$gte": 1450787615, "$lte": 1450855155  
            }
        }
    },
    { "$unwind": "$time" },
    {
        "$match": {
            "time": {
                "$gte": 1450787615, "$lte": 1450855155  
            }
        }
    },
    {
        "$group": {
            "_id": "$word",
            "count": {
                "$sum": 1
            }
        }
    }
])

答案就像

{
    "result" : [ 
        {
            "_id" : "batman",
            "count" : 3
        }, 
        {
            "_id" : "dear",
            "count" : 1
        }, 
        {
            "_id" : "ghost",
            "count" : 1
        }
    ],
    "ok" : 1
}
db.collection.find({time:{$gt: 1450787307, $lt: 1450787615}}); 

这将首先为您提供适合您给定时间范围的所有文档的光标。 一旦有了它,您就可以遍历光标并打印出名称以及一些循环逻辑以查找每个事件的发生次数。 我仅与mongodb进行过轻松合作,因此可能会有一种更有效的方法。

参考: https : //docs.mongodb.org/v3.0/reference/method/db.collection.find/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM