복붙노트

[MONGODB] MongoDB를 별개의 기록을 얻을

MONGODB

MongoDB를 별개의 기록을 얻을

나는 형식을 다음의 컬렉션이있는 나는 MongoDB를 사용하고 있습니다.

{"id" : 1 , name : x  ttm : 23 , val : 5 }
{"id" : 1 , name : x  ttm : 34 , val : 1 }
{"id" : 1 , name : x  ttm : 24 , val : 2 }
{"id" : 2 , name : x  ttm : 56 , val : 3 }
{"id" : 2 , name : x  ttm : 76 , val : 3 }
{"id" : 3 , name : x  ttm : 54 , val : 7 }

해당 모음에 나는 이런 식으로 내림차순으로 기록을 얻기 위해 조회했다 :

db.foo.find({"id" : {"$in" : [1,2,3]}}).sort(ttm : -1).limit(3)

그러나 동일한 ID = 1의 두 개의 레코드를 제공하고 나는 그것이 ID 당 한 기록을 제공하도록 기록을합니다.

그것은 MongoDB를에 수 있습니까?

해결법

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

    1.쿼리와 함께 사용할 수 있습니다 MongoDB의에서 별개의 명령이 있습니다. 그러나, 나는이 그냥 확신이 당신이 경우 원하는 정확히 무엇을 줄 것 아니에요 때문에 (즉, 귀하의 경우, 당신은 단지 ID 값이 반환받을 것) 당신의 이름을 특정 키 값의 고유 한 목록을 반환 생각 전체 문서를 필요 - 대신 맵리 듀스가 필요할 수 있습니다.

    쿼리와 함께 사용할 수 있습니다 MongoDB의에서 별개의 명령이 있습니다. 그러나, 나는이 그냥 확신이 당신이 경우 원하는 정확히 무엇을 줄 것 아니에요 때문에 (즉, 귀하의 경우, 당신은 단지 ID 값이 반환받을 것) 당신의 이름을 특정 키 값의 고유 한 목록을 반환 생각 전체 문서를 필요 - 대신 맵리 듀스가 필요할 수 있습니다.

    별개의 문서 : http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

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

    2.당신은 집계를 사용하고 싶습니다. 이 같은 그렇게 할 수 있습니다 :

    당신은 집계를 사용하고 싶습니다. 이 같은 그렇게 할 수 있습니다 :

    db.test.aggregate([
        // each Object is an aggregation.
        {
            $group: {
                originalId: {$first: '$_id'}, // Hold onto original ID.
                _id: '$id', // Set the unique identifier
                val:  {$first: '$val'},
                name: {$first: '$name'},
                ttm:  {$first: '$ttm'}
            }
    
        }, {
            // this receives the output from the first aggregation.
            // So the (originally) non-unique 'id' field is now
            // present as the _id field. We want to rename it.
            $project:{
                _id : '$originalId', // Restore original ID.
    
                id  : '$_id', // 
                val : '$val',
                name: '$name',
                ttm : '$ttm'
            }
        }
    ])
    

    이는 10 만 개 문서 내 테스트 DB를위한 매우 빠른 ... ~ 90ms의 것입니다.

    예:

    db.test.find()
    // { "_id" : ObjectId("55fb595b241fee91ac4cd881"), "id" : 1, "name" : "x", "ttm" : 23, "val" : 5 }
    // { "_id" : ObjectId("55fb596d241fee91ac4cd882"), "id" : 1, "name" : "x", "ttm" : 34, "val" : 1 }
    // { "_id" : ObjectId("55fb59c8241fee91ac4cd883"), "id" : 1, "name" : "x", "ttm" : 24, "val" : 2 }
    // { "_id" : ObjectId("55fb59d9241fee91ac4cd884"), "id" : 2, "name" : "x", "ttm" : 56, "val" : 3 }
    // { "_id" : ObjectId("55fb59e7241fee91ac4cd885"), "id" : 2, "name" : "x", "ttm" : 76, "val" : 3 }
    // { "_id" : ObjectId("55fb59f9241fee91ac4cd886"), "id" : 3, "name" : "x", "ttm" : 54, "val" : 7 }
    
    
    db.test.aggregate(/* from first code snippet */)
    
    // output
    {
        "result" : [
            {
                "_id" : ObjectId("55fb59f9241fee91ac4cd886"),
                "val" : 7,
                "name" : "x",
                "ttm" : 54,
                "id" : 3
            },
            {
                "_id" : ObjectId("55fb59d9241fee91ac4cd884"),
                "val" : 3,
                "name" : "x",
                "ttm" : 56,
                "id" : 2
            },
            {
                "_id" : ObjectId("55fb595b241fee91ac4cd881"),
                "val" : 5,
                "name" : "x",
                "ttm" : 23,
                "id" : 1
            }
        ],
        "ok" : 1
    }
    

    장점 : 거의 확실히 빠른 방법.

    단점 : 복잡한 집계 API의 사용을 포함한다. 또한, 단단히 문서의 원래 스키마에 연결된다. 이 일반화 비록, 그것은 가능하다.

  3. ==============================

    3.문제는 당신이 일치하는 결과 사이에서 선택하는 방법에 대한 쿼리에 어떤 논리를 제공하지 않고 하나에 이르기까지 3 개 일치하는 레코드를 증류 할 것입니다.

    문제는 당신이 일치하는 결과 사이에서 선택하는 방법에 대한 쿼리에 어떤 논리를 제공하지 않고 하나에 이르기까지 3 개 일치하는 레코드를 증류 할 것입니다.

    옵션은 어떤 종류의 통합 로직 (예를 들어, 각 열에 대한 최대 또는 최소 값을 선택)를 지정하거나 선택 별개의 쿼리를 실행하기 만하면 구별되어야 할 것으로 필드를 선택 기본적으로 있습니다.

    querymongo.com는 (SQL에서 MongoDB를에) 당신이 별개의 쿼리를 번역의 좋은 일을한다.

    예를 들어,이 SQL :

    SELECT DISTINCT columnA FROM collection WHERE columnA > 5
    

    이 MongoDB를로 반환됩니다 :

    db.runCommand({
        "distinct": "collection",
        "query": {
            "columnA": {
                "$gt": 5
            }
        },
        "key": "columnA"
    });
    
  4. ==============================

    4.나는이 같은 집계를 사용할 수 있다고 생각합니다

    나는이 같은 집계를 사용할 수 있다고 생각합니다

    collection.aggregate({
       $group : {
            "_id" : "$id",
            "docs" : { 
                $first : { 
                "name" : "$name",
                "ttm" : "$ttm",
                "val" : "$val",
                }
            } 
        }
    });
    
  5. ==============================

    5.당신은 자바 스크립트를 사용하여 파일의 서로 다른 결과를 기록 할 경우 ...이 당신이 어떻게

    당신은 자바 스크립트를 사용하여 파일의 서로 다른 결과를 기록 할 경우 ...이 당신이 어떻게

    cursor = db.myColl.find({'fieldName':'fieldValue'})
    
    var Arr = new Array();
    var count = 0;
    
    cursor.forEach(
    
    function(x) {
    
        var temp = x.id;    
    var index = Arr.indexOf(temp);      
    if(index==-1)
       {
         printjson(x.id);
         Arr[count] = temp;
             count++;
       }
    })
    
  6. from https://stackoverflow.com/questions/5089162/mongodb-get-distinct-records by cc-by-sa and MIT license