MongoDB通过NodeJS的部分帐户

时间:2014-01-20 09:45:55

标签: javascript node.js mongodb

在查看Mongo Count docs后,它显示以下代码:

    // Peform a partial account where b=1
    collection.count({b:1}, function(err, count) {

它计算每个b:1的文档。这些文件看起来像这样

{
    a:1,
    b:1,
    c:1
}

如何在更深入的级别找到部分帐户。例如,请考虑以下文档。如何计算包含 "Name": "LOG-11-05-SH-O1.mp4"的每个文档?

   "display": {
     "0": {
       "Name": "LOG-11-05-SH-O1.mp4",
       "Type": "Startup",
       "Count": "2",
       "Detail": {
         "0": {
           "Start": "2013-01-20,11:32:22",
           "End": "2013-01-20,11:32:30" 
        },
         "1": {
           "Start": "2013-01-20,11:32:22",
           "End": "2013-01-20,11:32:30" 
        } 
      } 
    },
     "1": { ....

我知道"display.0.Name" : "LOG-11-05-SH-O1.mp4"每次"LOG-11-05-SH-O1.mp4"都会在显示0下显示,但有时数字可能会改变。例如,下次时间"LOG-11-05-SH-O1.mp4"可能会显示1.因此有没有办法仅对“LOG-11-05-SH-O1.mp4”执行计数或者忽略中间数?

2 个答案:

答案 0 :(得分:1)

请参阅我对您的问题的评论,但如果不使用数组而不是使用display的值的对象,我看不到这样做的方法。如果它是一个数组,这就变得微不足道了。

假设您的数据如下所示:

"display": {[
  {
   "Name": "LOG-11-05-SH-O1.mp4",
   "Type": "Startup",
   "Count": "2",
   "Detail": {
     "0": {
       "Start": "2013-01-20,11:32:22",
       "End": "2013-01-20,11:32:30" 
    },
     "1": {
       "Start": "2013-01-20,11:32:22",
       "End": "2013-01-20,11:32:30" 
    } 
  } 
, { ....}
]}

然后你只是查询:

db.foos.count({"display": {$elemMatch: { "Name" : "LOG-11-05-SH-O1.mp4"}}})

以下是$ elemMatch:http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/上的相关MongoDB页面。

如果您必须保留对象架构,那么您可以获取所有记录并在应用程序端而不是在MongoDB中进行计数。

如果其他人知道如何在没有阵列的情况下解决此问题,我很高兴收到一个downvote,然后删除那些不正确的答案。

答案 1 :(得分:0)

我一开始并没有意识到这一点。答案很简单:

"display.Name": "LOG-11-05-SH-O1.mp4"

这将查找显示中具有以下名称的所有条目。