2017-06-15 1 views
1

MongoDBシェルから集約をMongoidをODMとして使用するルビコードに変換しようとしています。集計を使用して配列サイズをカウントするにはmongoidを使用してください

私はこのようないくつかの書類(非常に単純化した例を)持っている:

{ 
    "name": "Foo", 
    "tags": ["tag1", "tag2", "tagN"] 
}, 
{ 
    "name": "Bar", 
    "tags": ["tagA", "tag2"] 
}, 
... 

今私は名前フィールドを持つすべての文書およびそれぞれのタグの合計数を取得したいのですが。

db.documents.aggregate(
    {$project: {name: 1, tags_count: {$size: $tags}} 
) 

そして、それが返されます:私はこのような集約フレームワークを使用してそれを達成することができMongoDBのシェルで

[{"name": "Foo", "tags_count": 3}, 
{"name": "Bar", "tags_count": 2}] 

イライラ一部を、私は同じことを実現しようとしていますMongoidをODMとして使用しているレールアプリ内でクエリを実行します。

コードは(レールコンソールを使用して)次のようになります。

Document.collection.aggregate(
    [ 
    {'$project': {name: 1, tags_count: {'$size': '$tags'}}} 
    ] 
).to_a 

そして、それは次のエラーを返します。

Mongo::Error::OperationFailure: The argument to $size must be an Array, but was of type: EOO (17124)

私の質問は:どのように私はMongoidは$tagsがに言及していることを理解させることができます正しいフィールド?コードから抜けているのは何ですか?

ありがとう

+1

データに実際に配列が含まれていないか、または一貫していないように見えます。同様の理由で、同じデータのシェルで同じステートメントが失敗するはずです。 –

答えて

1

フィールドに配列が一貫していないようです。

Document.collection.aggregate(
    [ 
    {'$match': { 'tags_count': { '$exists': true } } }, 
    {'$project': {name: 1, tags_count: {'$size': '$tags'}}} 
    ] 
).to_a 
:フィールドが $existsを使用して全く存在しない場合、あなたは、単にスキップすることができ

Document.collection.aggregate(
    [ 
    {'$project': {name: 1, tags_count: {'$size': { '$ifNull': [ '$tags', [] ] } } }} 
    ] 
).to_a 

代わり:このためには、何も見つからなかったので、$size0などを返却された空の配列を配置する$ifNullを使用することができます

もちろん、選択したドキュメントをフィルタリングして、目的の効果が得られる場合とそうでない場合があります。

関連する問題