$ type
は使用できません
配列内の要素のタイプは「文字列」であり、ドキュメントに記載されているように、ここでドキュメントをフィルタリングする演算子:
しかし幸いなことに、MongoDBは $ examples
も提供します ここで数値配列インデックスとともに使用できる演算子。
では、これらのドキュメントをどのように更新できますか?
ええと、MongoDBバージョン<=3.2から、私たちが持っている唯一のオプションは mapReduce()
ただし、最初に、MongoDBの次のリリースで他の代替案を見てみましょう。
MongoDB 3.4以降、 $ project
ドキュメントと$split
を使用します 文字列を部分文字列の配列に分割する演算子。
文字列である「タグ」のみを分割するには、論理的なが必要であることに注意してください。 $ cond
文字列である値のみを分割するための処理。ここでの条件は、 $ eq
です。
true
と評価されます $ type
の場合 フィールドのは"string"
と同じです 。ちなみに$type
これは3.4の新機能です。
最後に、 $ out
>
パイプラインステージ演算子。 ただし、 $ project
に他のフィールドを含めることを明示的に指定する必要があります ステージ 。
db.collection.aggregate(
[
{ "$project": {
"tags": {
"$cond": [
{ "$eq": [
{ "$type": "$tags" },
"string"
]},
{ "$split": [ "$tags", " " ] },
"$tags"
]
}
}},
{ "$out": "collection" }
]
)
mapReduce
を使用 、配列を使用する必要があります。 protocol.split()
map関数で部分文字列の配列を出力します 。また、「クエリ」オプションを使用してドキュメントをフィルタリングする必要があります。そこから、「results」配列と $ set
を繰り返す必要があります。 bulkWrite()
3.2で新しく追加されたメソッド、または現在廃止されている Bulk()
こちら
に示すように2.6または3.0を使用している場合
db.collection.mapReduce(
function() { emit(this._id, this.tags.split(" ")); },
function(key, value) {},
{
"out": { "inline": 1 },
"query": {
"tags.0": { "$exists": false },
"tags": { "$type": 2 }
}
}
)['results']