23

私はMongoDBと、それが私にとって分析にどのように役立つかを学ぼうとしています。私は彼らのウェブサイトで利用可能なJavaScriptコンソールで遊んでいて、次のアイテムを作成しました。

{"title": "Cool", "_id": {"$oid": "503e4dc0cc93742e0d0ccad3"}, "tags": ["twenty", "sixty"]}
{"title": "Other", "_id": {"$oid": "503e4e5bcc93742e0d0ccad4"}, "tags": ["ten", "thirty"]}
{"title": "Ouch", "_id": {"$oid": "503e4e72cc93742e0d0ccad5"}, "tags": ["twenty", "seventy"]}
{"title": "Final", "_id": {"$oid": "503e4e72cc93742e0d0ccad6"}, "tags": ["sixty", "seventy"]}

私がやりたいのはクエリですので、これらすべてのオブジェクトの一意のタグのリストを取得します。結果は次のようになります。

["ten", "twenty", "thirty", "sixty", "seventy"]

これを照会するにはどうすればよいですか?私はdistinct()それを試みていますが、呼び出しは常にクエリを実行せずに失敗します。

4

5 に答える 5

31

彼らのウェブサイトで失敗するコードは、実際のMongoDBインスタンスで機能します。

> db.posts.insert({title: "Hello", tags: ["one", "five"]});
> db.posts.insert({title: "World", tags: ["one", "three"]});
> db.posts.distinct("tags");
[ "one", "three", "five"]

変。

于 2012-08-29T17:55:09.573 に答える
12

集約フレームワークを使用できます。結果をどのように構造化するかに応じて、次のいずれかを使用できます

var pipeline = [ 
        {"$unwind": "$tags" } ,
        { "$group": { _id: "$tags" } }
    ];
R = db.tb.aggregate( pipeline );
printjson(R);

{
        "result" : [
                {
                        "_id" : "seventy"
                },
                {
                        "_id" : "ten"
                },
                {
                        "_id" : "sixty"
                },
                {
                        "_id" : "thirty"
                },
                {
                        "_id" : "twenty"
                }
        ],
        "ok" : 1
}

また

var pipeline = [ 
        {"$unwind": "$tags" } ,
        { "$group": 
            { _id: null, tags: {"$addToSet": "$tags" }  }
        }
    ];
R = db.tb.aggregate( pipeline );
printjson(R);

{
        "result" : [
                {
                        "_id" : null,
                        "tags" : [
                                "seventy",
                                "ten",
                                "sixty",
                                "thirty",
                                "twenty"
                        ]
                }
        ],
        "ok" : 1
}
于 2012-08-29T18:30:11.023 に答える
11

これを使用できるはずです:

db.mycollection.distinct("tags").sort()
于 2014-09-29T18:33:11.657 に答える
5

集計パイプラインを使用して一意の配列要素を取得する別の方法

db.blogs.aggregate(
  [
    {$group:{_id : null, uniqueTags : {$push : "$tags"}}},
    {$project:{
      _id : 0,
      uniqueTags : {
        $reduce : {
          input : "$uniqueTags", 
          initialValue :[], 
          in : {$let : {
            vars : {elem : { $concatArrays : ["$$this", "$$value"] }},
            in : {$setUnion : "$$elem"}
          }}
        }
      }
    }}
  ]
)

コレクション

> db.blogs.find()
{ "_id" : ObjectId("5a6d53faca11d88f428a2999"), "name" : "sdfdef", "tags" : [ "abc", "def", "efg", "abc" ] }
{ "_id" : ObjectId("5a6d5434ca11d88f428a299a"), "name" : "abcdef", "tags" : [ "abc", "ijk", "lmo", "zyx" ] }
> 

パイプライン

>   db.blogs.aggregate(
...     [
...       {$group:{_id : null, uniqueTags : {$push : "$tags"}}},
...       {$project:{
...         _id : 0,
...         uniqueTags : {
...           $reduce : {
...             input : "$uniqueTags", 
...             initialValue :[], 
...             in : {$let : {
...               vars : {elem : { $concatArrays : ["$$this", "$$value"] }},
...               in : {$setUnion : "$$elem"}
...             }}
...           }
...         }
...       }}
...     ]
...   )

結果

{ "uniqueTags" : [ "abc", "def", "efg", "ijk", "lmo", "zyx" ] }
于 2018-01-28T05:10:03.237 に答える
3

利用可能なWebMongoコンソールがいくつかあります。

ただし、ヘルプを入力すると、サポートする操作の数が非常に少ないことがわかります。

HELP
Note: Only a subset of MongoDB's features are provided here.
For everything else, download and install at mongodb.org.

db.foo.help()                 help on collection method
db.foo.find()                 list objects in collection foo
db.foo.save({a: 1})           save a document to collection foo
db.foo.update({a: 1}, {a: 2}) update document where a == 1
db.foo.find({a: 1})           list objects in foo where a == 1

it                            use to further iterate over a cursor

それ自体はサポートされていないため、distinctは機能しません。

于 2012-08-29T18:16:11.200 に答える