2017-02-25 55 views
1

我有一個集合,看起來像這樣:的MongoDB>添加新項的對象的數組內

{ 
    _id: ..., 
    checkins: [ 
     { 
      id: ..., 
      createdAt: 1488052032, 
      ... 
     }, 
     { 
      id: ..., 
      createdAt: 1488052032, 
      ... 
     } 
    ] 
} 

我要添加新的元素稱爲created旁邊IDcreatedAt屬性(在checkins內部,一個對象數組)。我想爲所有沒有這個新元素的元素做到這一點。

我知道如何檢查一個對象是否已經有一個屬性,但是我在添加元素時遇到了一些問題。我正在使用下面的代碼,並返回一個錯誤說:位置運算符沒有找到所需的匹配查詢

db.profiles.updateMany(
    {}, 
    {$set: {"checkins.$.created": new Date(0)}} 
) 

有關我在做什麼錯的任何想法?

回答

1

由於多個陣列子文檔的更新是不可能的,因爲是(檢查this post),你可以匹配而不created場至少匹配一個子文檔,所有的文檔,然後通過一個更新一個必須更新的子文檔:

db.profiles.find({ 
    "checkins": { 
     "$elemMatch": { "created": { "$exists": false } } 
    } 
}).forEach(function(doc) { 

    doc.checkins.filter(function(event) { 
     return !('created' in event) 
    }).forEach(function(event) { 

     db.profiles.update({ 
      "_id": doc._id, 
      "checkins": { 
       "$elemMatch": { "created": { "$exists": false } } 
      } 
     }, { 
      $set: { 
       "checkins.$.created": new Date(0) 
      } 
     }); 
    }); 
}); 

請注意elemMatchexists一起使用用於檢查字段是否存在。這應該可以解決你的初始錯誤信息updateMany請求(但你的初始請求不會更新你所有的陣列元素)