2016-04-28 15 views
2

フィールドの有無をベース投影パイプラインでのmongo $指揮フィールドを実装する -は、私はMongoのパイプラインで次の操作を実行しようとしている

{ $project: { 
    newAttribute: { 
     $cond: [ 
      { $exists: { '$myAttribute': true } }, 
      1, 
      0 
     ] 
    } 
}} 

ただし、これはエラーをスローします -

Error: command failed: { 
    "errmsg" : "exception: invalid operator '$exists'", 
    "code" : 15999, 
    "ok" : 0 
} 

私はhereのような何かをしようとする人を見ることができますが、$ifNullフィールドはmyAttributeフィールドの値ではなく、値1が必要なので助けになりません。

これを解決する良い方法はありますか?あなたのMongoDBサーバのバージョンは、このような3.2以降であれば

答えて

2

あなたは$allElementsTrueまたは$anyElementTrueを使用することができます。

db.collection.aggregate([ 
    { "$project": { 
     "newAttribute": { 
      "$cond": [ 
       { "$anyElementTrue": [ [ "$myAttribute" ] ] }, 
       1, 
       0 
      ] 
     } 
    }} 
]) 

MongoDBのバージョン< = 3.0からは、常にフィールドが、その後存在するかどうかを確認する$ifNullオペレータに頼ることができます$cond演算子を使用して値を適切に設定します。

db.collection.aggregate([ 
    { "$project": { 
     "newAttribute": { 
      "$cond": [ 
       { "$eq": [ 
        { "$ifNull": [ "$myAttribute", 99999 ] }, 
        99999 
       ]}, 
       0, 
       1 
      ] 
     } 
    }} 
]) 
+0

ブリリアント!ありがとう! –

関連する問題