0

この構造では、その特定の列を出力(:i "" から可能な範囲よりも削除したいです か?

like..inputは同じです

{{

:aa {:a "a_val",:b "b_val"},

:qq {:abc 
        {
            :x1 {:x "abc",:u "ee"},
            :x2 {:y "abc",:i "ee"},
            :x3 {:x "abc",:i ""}
    }   
    },
:ww {:xyz {
            :y1 {:x "abc",:u "ee"},
            :y2 {:y "abc",:i ""},
            :y3 {:x "abc",:i "ee"}
          } 
    }

}

しかし、それの出力は次のようになります...

{{

:aa {:a "a_val",:b "b_val"},
:qq {:abc 
        {
            :x1 {:x "abc",:u "ee"},
            :x2 {:y "abc",:i "ee"}
    }   
    },
:ww {:xyz {
            :y1 {:x "abc",:u "ee"},
            :y3 {:x "abc",:i "ee"}
          } 
    }

}

4

2 に答える 2

2

一般的な方法では実行できない(かなり恐ろしい)スキーマが原因です。上位レベルのドキュメントのフィールド名を知っている必要があるため、スキーマで埋め込みドキュメントのフィールドのクエリが可能になりました。つまり、スキーマが適切でないため、「unset all'x'where'i'isempty」というクエリを作成することはできません。

必要なことを可能にするために、スキーマを再設計する必要があります。原則として、データで何をする必要があるかを書き留めることから始め、次に最も一般的なユースケースを最も効率的に許可するスキーマを設計します。

于 2012-04-13T09:19:24.293 に答える
1

前の質問から構築しています...これは、元のフィルタリングと深いサブ要素の削除の両方を行います。

user> (defn vvals [m] (when (map? m) (vals m)))
'user/vvals
user> (into {}
        (for [[k v] xx
              :when (some #{"0"} (for [v (vvals v), v (vvals v)] (:i v)))
              :let [v (map (fn [[k v]] [k (into {} (remove #(= (:i (val %)) "0") v))]) v)]]
           [k (into {} v)]))

これは機能しますが、醜い混乱に変わりつつあります。たぶん、@ RemonvanVlietによるアドバイスを検討してください。タスクに適している可能性のあるzippersAPIもあります。

于 2012-04-13T09:43:29.647 に答える