2016-05-14 78 views
0

我有子文檔的陣列像下面MongoDB的更新查詢基於所述值未設置特定陣列成員

 

    /* record 1 */ 
     { 
         "_id" : "462044", 
         "program" : [ 
           { 
            "name" : "Business Services" 
           }, 
           { 
            "name" : "Homeland Security" 
           }, 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Engineering" 
           }, 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Computer Software" 
           } 
           ] 

      } 

    /* record 2 */ 
      { 
         "_id" : "462045", 
         "program" : [ 
           { 
            "name" : "Business Services" 
           }, 
           { 
            "name" : "Homeland Security" 
           }, 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Engineering" 
           }, 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Computer Software" 
           } 
           ] 

      }  

[我想刪除不具有「標題」的子構件陣列成員]

我怎麼能寫蒙戈更新查詢或函數的NodeJS得到以下文件集

 

    /* record 1 */ 
     { 

         "_id" : "462044", 
         "program" : [ 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Engineering" 
           }, 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Computer Software" 
           } 
           ] 

     } 


    /* record 2 */ 
     { 
         "_id" : "462045", 
         "program [ 
           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Engineering" 
           }, 

           { 
            "title" : [ 
             "associate" 
            ], 
            "name" : "Computer Software" 
           } 
           ] 

     }  

回答

0

那麼,首先所有的文檔結構看起來很奇怪。每個記錄都有一個不同的字段,表示基本上相同的信息,在您的案例中school1school2

如果您將這些字段重命名爲school,可以輕鬆修復。

如果您修復了文檔結構,您可以藉助聚合框架和普通更新查詢輕鬆地刪除所需的子文檔。

例子:

db.collection.aggregate([ 
    { 
    $project: { 
     school: { 
     $filter: { 
      input: "$school.program", 
      as: "prog", 
      cond: { 
      $ne: [ 
       { 
       $ifNull: [ 
        "$$prog.title", 
        true 
       ] 
       }, 
       true 
      ] 
      } 
     } 
     } 
    } 
    } 
]).forEach(function(o){ 
    db.collection.updateOne({ 
    _id: o._id 
    }, 
    { 
    $set: { 
     school: o.school 
    } 
    }); 
}) 

這將會把你的舊文件(刪除所有的子域形成不包含title程序:

{ 
    "_id" : ObjectId("57371cdf81e9959ba1a5fab0"), 
    "school" : [ 
     { 
      "title" : [ 
       "associate" 
      ], 
      "name" : "Engineering" 
     }, 
     { 
      "title" : [ 
       "associate" 
      ], 
      "name" : "Computer Software" 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("57371cdf81e9959ba1a5fab1"), 
    "school" : [ 
     { 
      "title" : [ 
       "associate" 
      ], 
      "name" : "Engineering" 
     }, 
     { 
      "title" : [ 
       "associate" 
      ], 
      "name" : "Computer Software" 
     } 
    ] 
}