MongoDBでは、$push
を使用できます 配列に値を追加する演算子。
さまざまな修飾子を使用して、配列内の値の位置、配列内の要素の順序、複数の値の追加などを指定できます。
例
products
というコレクションがあるとします。 次のドキュメントを使用:
db.products.find()
結果:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }
そして、ドキュメント3の配列に値を追加したいとします。
$push
を使用できます update()
と組み合わせて 値を追加するには:
db.products.update(
{ _id: 3 },
{ $push: { sizes: "XL" } }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
コレクションをもう一度見て、変更を確認しましょう:
db.products.find()
結果:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L", "XL" ] }
特定の位置に値を挿入
$each
を使用できます および$position
値を配列のどこに挿入するかを指定する修飾子。
たとえば、0
の値を使用できます 配列の先頭に挿入します。
例:
db.products.update(
{ _id: 3 },
{
$push: {
sizes: {
$each: [ "S" ],
$position: 0
}
}
}
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
$each
修飾子は、配列フィールドに複数の値を追加します。この場合、配列に挿入した値は1つだけですが、$position
を使用します。 修飾子。$each
と一緒に表示する必要があります 修飾子。
コレクションをもう一度確認しましょう:
db.products.find()
結果:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
追加と並べ替え
次のドキュメントを含むコレクションがあるとします。
db.players.find()
結果:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
また、ドキュメント3の配列にいくつかの値を追加したいが、値を追加した後に配列を昇順で並べ替えたいとします。
これを行うことができます:
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 5, 12 ],
$sort: 1
}
}
}
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
コレクションを表示すると、3番目のドキュメントがそれに応じて変更されていることがわかります。
db.players.find()
結果:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 5, 8, 11, 12, 15 ] }
降順で並べ替えるには、$sort: -1
を使用します 。
アレイをスライスする
$slice
を使用できます 配列内の要素の数を制限する修飾子。
たとえば、配列に別の値を追加してから、配列を特定の数の要素にスライスします。
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 3 ],
$slice: 3
}
}
}
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
それでは、コレクションをもう一度確認しましょう:
db.players.find()
結果:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 5, 8, 11 ] }
この場合、配列はスライスされましたが、追加した値は最終的な配列になりませんでした。これは、値が配列に追加され、$sort
を使用しなかったためです。 演算であるため、配列が最初の3つの要素にスライスされる前に、値は配列の最後に残りました。
今回も$sort
を除いて、ここにあります。 修飾子。
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 3 ],
$sort: 1,
$slice: 3
}
}
}
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
コレクションを確認してください:
db.players.find()
結果:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 3, 5, 8 ] }
存在しない場合にのみ値を追加
値がまだ配列に存在しない場合にのみ値を追加する場合は、$addToSet
の使用を検討してください。 オペレーター。