Mongo-计算不同命名节点的大小(不是其值而是节点数)

时间:2018-11-03 23:51:58

标签: mongodb mongodb-query aggregation-framework

在下面的json中,我想找出几个不同节点下所有唯一/不同条目的计数。

我认为应该有一个非聚合框架解决方案,但我找不到聚合或非聚合。

对于每个节点,我可以使用:

db.collection.distinct('nodaA.title').length

并将“”替换为其他节点的相应字段。但我想通过1个查询来获取“ NodeB.subNoda1.author”,“ NodeB.subNode2.song”和“ NodeB.subNode3.picture”的计数。

我想得到类似
的结果 标题:1
作者:2
歌曲:3
图片:1

    "nodaA": [
      {
        "title": "light",
        "id"   : 1
      }
    ],
    "NodeB": {
      "subBnode1": [
        {
          "author": "Gazundheit"
        },
        {
          "author": "Max Weasley"
        }
      ],
      "subBnode2": [
        {
          "song" : "what is love"
        },
       {
          "song" : "gangster's paradise"
        },
       {
          "song" : "wind is gone"
        }
      ],
      "subBnode3": [
        {
          "picture" : "inappropriate"
        }
      ]
    }
  }

1 个答案:

答案 0 :(得分:0)

正如NeilLunn指出的那样,这只能通过MapReduce完成,这就是我最终得到的结果:

地图:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory
    android:title="Scenes">
    <DropDownPreference
        android:key="scenario"
        android:title="Select scene"
        android:summary="%s"
        android:entries="@array/scenarios"
        android:entryValues="@array/scenarios_values" />
</PreferenceCategory>

<PreferenceCategory
    android:title="Demo">
    <SwitchPreference
        android:key="connect_on_startup"
        android:title="Auto Connect"
        android:defaultValue="false"
        android:summary="Connect automatically at startup" />
    <EditTextPreference
        android:title="UserName"
        android:key="username"
        android:summary="Please provide your Username"
        android:maxLines="1"
        android:singleLine="true">
    </EditTextPreference>
    <EditTextPreference
        android:inputType="textPassword"
        android:title="Password"
        android:key="password"
        android:summary="Please provide your Password"
        android:password="true" />
</PreferenceCategory>

减少:

function () {
   emit("titles", this.title);
   for (var key in this.nodeB) {       
        emit(key, this.nodeB[key]);
       }
         }

很抱歉,如果无法完全编译-我从实际数据中进行了修改,但这就是我所做的要旨,以防万一它可以帮助任何人。如果需要更多详细信息,请添加。