MongoDBバージョンの場合>=3.2
:
.bulkWrite()
を利用できます :
let bulkArr = [
{
updateMany: {
filter: { name: null },
update: { $unset: { name: 1 } }
}
},
{
updateMany: {
filter: { Roll_no: null },
update: { $unset: { Roll_no: 1 } }
}
},
{
updateMany: {
filter: { hobby: null },
update: { $unset: { hobby: 1 } }
}
},
];
/** All filter conditions will be executed on all docs
* but respective update operation will only be executed if respective filter matches (kind of individual ops) */
db.collection.bulkWrite(bulkArr);
参照: 一括書き込み
MongoDBバージョンの場合>=4.2
:
null
を持つ複数のフィールド(フィールド名をリストに表示できない、または不明な場合)を削除したかったため 値、以下のクエリを試してください:
db.collection.update(
{}, // Try to use a filter if possible
[
/**
* using project as first stage in aggregation-pipeline
* Iterate on keys/fields of document & remove fields where their value is 'null'
*/
{
$project: {
doc: {
$arrayToObject: { $filter: { input: { $objectToArray: "$$ROOT" }, cond: { $ne: ["$$this.v", null] } } }
}
}
},
/** Replace 'doc' object as root of document */
{
$replaceRoot: { newRoot: "$doc" }
}
],
{ multi: true }
);
テスト: モンゴプレイグラウンド
参照: update-with-an-aggregation-pipeline、aggregation-pipeline
注:
これは1回限りの操作であり、将来的にはJoi
を使用できると思います。 null
の書き込みを制限するnpmパッケージまたはmongooseスキーマバリデーター フィールド値としての。あまり多くないプラスデータセットサイズが大きすぎるかのようにフィールド名をリストできる場合は、$$REMOVE
で集計を使用してみてください '@thammada'によって提案されたように。
現在のところ、.updateMany()
のaggregation-pipeline 少数のmongoシェルバージョンでも多くのクライアントでサポートされていません-当時、クライアントへの私のチケットは.update()
を使用して解決されました 、機能しない場合は、update + { multi : true }
を使用してみてください 。