3

リストの完全な内容を取得せずに、各ドキュメントの配列の長さを取得するmongoクエリを実行しようとしています。理想的には、これは次の線に沿った投影オプションになります。

db.log.find({},{entries:{$length: 1}})

ただし、これはサポートされていません。これは、新しい集計フレームワークを使用してエレガントな方法で可能でしょうか? 私が思いついたのはこれです:

db.log.find({},{"entries.length": 1})

次のような結果が返されます。

{ "_id" : ObjectId("50d2fb07e64cfa55431de693"), "entries" : [   {    },     {    },     {    },     {    },     {    },     {    },     {    },     {  },   {    },     {    },     {    },     {    },     {    },     {  },   {    },     {    },     {    },     {    } ] }

これは醜いですが、完全なコンテンツを取得するネットワークの重みなしでこのリストの長さを数えることができるので、基本的には私のニーズに応えます。しかし、なぜこれが機能するのかわかりません。このクエリは実際に何をしているのでしょうか?

4

2 に答える 2

5

さて、私は2つのアプローチで考えることができました:

1) 集計フレームワークの使用:

db.log.aggregate([ { $unwind : "$entries" }, { $group : { _id : "$_id", entries : {$sum:1}  } }  ]);

2) または、エントリ数を保持するフィールドをドキュメントに追加できます。したがって、新しい値をエントリ配列にプッシュするたびに、カウンターをインクリメントする必要があります。更新は次のようになります。

db.log.update({ _id : 123 }, { $push : { entries : 'value' }, $inc : { entriesCount : 1 } })

明らかに、ここにはトレードオフがあります。集計フレームワークは、この単純な操作には高すぎます。ただし、ドキュメントにフィールドを追加すると、更新ごとにカウンターがインクリメントされます。

IMHO、回避策のように見えますが、カウンターはより合理的に見えます。

于 2012-12-19T19:03:36.417 に答える
1

mongodbのドキュメントによると:

$size も使用できます。

db.log.aggregate([{$project:{'_id':1, 'count':{$size: "$entriesCount"}}}]);
于 2015-12-10T00:26:33.517 に答える