29

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)

しかし、それは同じの2つのレコードを提供しid = 1、私はそれがごとに1つのレコードを提供するようなレコードが必要ですid

mongodbで可能ですか?

4

6 に答える 6

26

distinctmongodbには、クエリと組み合わせて使用​​できるコマンドがあります。ただし、これは名前を付けた特定のキーの値の個別のリストを返すだけだと思います(つまり、あなたの場合は、id値のみが返されます)ので、これがあなたが望むものを正確に提供するかどうかはわかりませんドキュメント全体が必要です-代わりにMapReduceが必要になる場合があります。

個別のドキュメント: http ://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

于 2011-02-23T09:45:47.017 に答える
21

集計を使用したい。あなたはこのようにそれをすることができます:

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'
        }
    }
])

これは非常に高速になります...100,000ドキュメントのテストDBの場合は約90ミリ秒です。

例:

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
}

長所:ほぼ間違いなく最速の方法です。

短所:複雑なAggregationAPIの使用が含まれます。また、ドキュメントの元のスキーマと緊密に結合されています。ただし、これを一般化することは可能かもしれません。

于 2015-09-18T00:20:29.960 に答える
8

このような骨材が使えると思います

collection.aggregate({
   $group : {
        "_id" : "$id",
        "docs" : { 
            $first : { 
            "name" : "$name",
            "ttm" : "$ttm",
            "val" : "$val",
            }
        } 
    }
});
于 2014-07-01T09:11:12.160 に答える
7

問題は、一致する結果から選択する方法についてクエリにロジックを提供せずに、一致する3つのレコードを1つに絞り込みたいということです。

基本的に、オプションは、ある種の集計ロジックを指定するか(たとえば、各列の最大値または最小値を選択する)、または個別のクエリを実行して、個別にしたいフィールドのみを選択することです。

querymongo.comは、これらの個別のクエリを(SQLからMongoDBに)変換するのに適しています。

たとえば、次のSQLは次のとおりです。

SELECT DISTINCT columnA FROM collection WHERE columnA > 5

このMongoDBとして返されます:

db.runCommand({
    "distinct": "collection",
    "query": {
        "columnA": {
            "$gt": 5
        }
    },
    "key": "columnA"
});
于 2012-12-13T16:47:32.767 に答える
3

javascriptを使用してファイルに個別の結果を書き込みたい場合...これがあなたのやり方です

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++;
   }
})
于 2013-04-16T17:03:35.497 に答える
1

個別のクエリを指定します。次の例では、deptが "A"に等しいドキュメントから、アイテムフィールドに埋め込まれたフィールドskuの個別の値を返します。

db.inventory.distinct( "item.sku", { dept: "A" } )

参照:https ://docs.mongodb.com/manual/reference/method/db.collection.distinct/

于 2020-08-28T16:51:22.003 に答える