복붙노트

[MONGODB] 인덱스에서 배열 필드의 별개의 집계를 얻기

MONGODB

인덱스에서 배열 필드의 별개의 집계를 얻기

나는 MongoDB를 배울려고 어떻게 나를 위해 분석을 위해 도움이 될 것입니다. 단순히 자신의 웹 사이트에 자바 스크립트 콘솔을 사용할 수 장난있어 다음과 같은 항목을 만들었습니다 :

{"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"]

어떻게 이것에 대한 쿼리는 무엇입니까? 나는 별개의 ()는 그것을 시도하고 있지만, 전화는 항상 심지어 쿼리하지 않고 실패합니다.

해결법

  1. ==============================

    1.자신의 웹 사이트에 실패 코드는 실제 MongoDB의 인스턴스에서 작동합니다 :

    자신의 웹 사이트에 실패 코드는 실제 MongoDB의 인스턴스에서 작동합니다 :

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

    기묘한.

  2. ==============================

    2.당신은이를 사용할 수 있어야합니다 :

    당신은이를 사용할 수 있어야합니다 :

    db.mycollection.distinct("tags").sort()
    
  3. ==============================

    3.당신은 통합 프레임 워크를 사용할 수 있습니다. 당신이 구조 결과를 원하는 방법에 따라 중 하나를 사용할 수 있습니다

    당신은 통합 프레임 워크를 사용할 수 있습니다. 당신이 구조 결과를 원하는 방법에 따라 중 하나를 사용할 수 있습니다

    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
    }
    
  4. ==============================

    4.웹 몽고의 커플 사용할 콘솔 있습니다 :

    웹 몽고의 커플 사용할 콘솔 있습니다 :

    당신이 그들에 도움을 입력하면하지만 그들은 단지 작전의 매우 작은 수를 지원 알게 될 것이다 :

    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
    

    이 지원되지 않기 때문에 이러한 구별대로 작동하지 않습니다.

  5. ==============================

    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" ] }
    
  6. from https://stackoverflow.com/questions/12183444/getting-a-distinct-aggregation-of-an-array-field-across-indexes by cc-by-sa and MIT license