MongoDB入門4-ドキュメントとモディファイヤの更新2


c)配列モディファイヤ
配列モディファイヤは、その名の通り配列を操作します.一般的に多くのグループの操作にはいくつかの異なる種類があるので、MongoDBにも異なる配列モディファイヤが用意されています.私たちは一つ一つ勉強します.
  • $pushモディファイヤ
  • $pushモディファイヤは、指定した配列の末端に新しい要素を挿入できます.この配列自体が存在しないと仮定すると、まずこの配列を作成します.今、私が今ブログを発表していると仮定して、発表すると、コメントが発表されました.この場合、コメントリストにコメントレコードを追加する必要があります.
    
       
      
      
      
    1. > db.blog.insert({"title":"A New Blog","content":"MongoDB tutorial..."}); 
    2. > db.blog.update({"title":"A New Blog"},{"$push":{"comments":{"name":"xiaobai","content":"very good"}}}); 
    3. > db.blog.find(); 
    4. "_id" : ObjectId("4ee47369af9c9fecc9c9cf61"), "comments" : [ { "name" : "xiaobai""content" : "very good" } ], "content" : "MongoDB tutorial...""title" : "A New Blog" } 
    5. >  

    以前は記録されていませんでしたが、現在はコメント配列が追加され、xiaobaiのコメントが追加されています.コメントを追加します.
    
       
      
      
      
    1. > db.blog.update({"title":"A New Blog"},{"$push":{"comments":{"name":"xiaohong","content":"very very good"}}}); 
    2. > db.blog.find(); 
    3. "_id" : ObjectId("4ee47369af9c9fecc9c9cf61"), "comments" : [     {     "name" : "xiaobai",     "content" : "very good" },     {    "name" : "xiaohong",     "content" : "very very good" } ], "content" : "MongoDB tutorial...""title" : "A New Blog" } 
    4. >  
  • $neモディファイヤ
  • このような場合、1人で1回だけコメントを許可する場合は、新しいコメントを追加するときに、追加するコメントがすでに存在するかどうかを判断する必要があります.$neモディファイヤは,あるレコードが存在しないか否かを判断し,存在しない場合にのみある操作を実行する.次に、上記の例を見てみましょう.コメントにlisiのコメントがない場合は、新しいlisiのコメントを挿入します.
    
       
      
      
      
    1. > db.blog.update({"title":"A New Blog","comments.name":{"$ne":"lisi"}},{"$push":{"comments":{"name":"lisi","comment":"Not Bad"}}}); 
    2. > db.blog.find(); 
    3. "_id" : ObjectId("4ee47369af9c9fecc9c9cf61"), "comments" : [     {     "name" : "xiaobai",     "content" : "very good" },     {    "name" : "xiaohong",     "content" : "very very good" },     {     "name" : "lisi",     "comment" : "Not Bad" } ], "content" : "MongoDB tutorial...""title" : "A New Blog" } 
    4. >  

    これで、上記のupdateコードを再度実行すると、lisiのコメントは追加されません.ここではプレゼンテーションをしません.
  • $addToSetモディファイヤ
  • このモディファイヤは実は上のようなことをしています.キーに重複する値があるかどうかを自動的に判断します.レコードを追加するには、存在しません.ユーザー情報に関するドキュメントが次のように表示されます.
    
       
      
      
      
    1. var user = {"name":"Tom","emailaddrs":["[email protected]","[email protected]"]}; 
    2. > db.users.insert(user); 
    3. > db.users.find(); 
    4. "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "name" : "Tom""emailaddrs" : [ "[email protected]""[email protected]" ] } 
    5. >  

    メールアドレスを追加する必要があります[email protected]このモディファイヤを使用して、新しいメールアドレスを追加できます.
    
       
      
      
      
    1. > db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$addToSet":{"emailaddrs":"[email protected]"}}); 
    2. > db.users.find(); 
    3. "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "[email protected]""[email protected]""[email protected]" ], "name" : "Tom" } 
    4. >  

    上記の操作を再度実行しても、メールアドレスの追加は繰り返されません.
  • $eachモディファイヤ($addToSetモディファイヤと組み合わせて使用)
  • $addToSetは$eachモディファイヤと組み合わせて一括変更を実現します.次に、上記のメールリストの例では、一度にいくつかのメールアドレスを追加する必要がある場合、$neと$pushを使用して複数のアドレスを一度に直接追加することはできません.操作は次のとおりです.
    
       
      
      
      
    1. > db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$addToSet":{"emailaddrs":{"$each":["[email protected]","[email protected]"]}}}); 
    2. > db.users.find(); 
    3. "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "[email protected]""[email protected]""[email protected]""[email protected]""[email protected]" ], "name" : "Tom" } 
    4. >  
  • $popモディファイヤ
  • このモディファイヤは、配列の任意の端の最初の値を削除できます.{「pop」:{key:1}}配列末尾値を削除し、{「pop」:{key:-1}}:配列ヘッダ値を削除します.以下の説明を行います.
    
       
      
      
      
    1. > db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pop":{"emailaddrs":1}}); 
    2. > db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pop":{"emailaddrs":-1}}); 
    3. > db.users.find(); 
    4. "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "[email protected]""[email protected]""[email protected]" ], "name" : "Tom" } 
    5. >  

    これにより、最初のメールアドレスと最後のメールアドレスが削除されます.
  • $pullモディファイヤ
  • このモディファイヤは、配列内の要素を削除するためにも使用されますが、いずれかを削除するだけでなく、条件マッチングによってすべての条件が満たされている値を削除します.上の例では削除できます[email protected]
    
       
      
      
      
    1. > db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pull":{"emailaddrs":"[email protected]"}}); 
    2. > db.users.find(); 
    3. "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "[email protected]""[email protected]" ], "name" : "Tom" } 
    4. >  
  • 配列位置決めモディファイヤ
  • 配列位置決めは、下付き文字と$(位置決めオペレータ)の2つの方法で実現できます.下の文字は0から始まります.
    配列の配置方法最初のメールアドレスを変更します.
    
       
      
      
      
    1. > db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$set":{"emailaddrs.0":"[email protected]"}}); 
    2. > db.users.find(); 
    3. "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "[email protected]""[email protected]" ], "name" : "Tom" } 
    4. >  

    上の場合、結果をクエリーしないと順序がわかりません.この問題を解決するために$ロケータオペレータを導入した.クエリー条件クエリーの結果(updateの最初のパラメータ)を一致させるために使用されます.
    上記のコメントの例に戻ると、コメントをxiaobaiのコメントにしたコメントをxiaoxiaobaiに変更します.
    
       
      
      
      
    1. > db.blog.update({"comments.name":"xiaobai"},{"$set":{"comments.$.name":"xiaoxiaobai"}}); 
    2. > db.blog.find() 
    3. "_id" : ObjectId("4ee47369af9c9fecc9c9cf61"), "comments" : [     {     "content" : "very good",     "name" : "xiaoxiaobai" },    {     "name" : "xiaohong",     "content" : "very very good" },     {     "name" : "lisi",     "comment" : "Not Bad" } ], "content" : "MongoDB tutorial...""title" : "A New Blog" } 
    4. >  

    複数の一致がある場合は、最初の一致のみが変更されます.
     
    上が基本的なモディファイヤです.
     
    参考書:
        《MongoDB:The definitive guide》