2015-04-22 178 views
1

我有一個用戶表中的MongoDB的列表,格式如下:MongoDB的查詢更新嵌套對象

{ 
    "_id" : ObjectId("ID"), 
    "user" : { 
       "id" : "userId", 
       "info" : "user info", 
       "subscriptions" : [ 
         { 
          "subName" : "sub1", 
          "frequency" : 1, 
          "contentId" : "contentId" 
         } 
       ] 
      } 
} 

我想訂閱對象添加到該數組命名爲「訂閱」。這是我的代碼目前的樣子,它不起作用。在這種情況下,我的JSONParser工作並返回正確的數組。

QueryBuilder builder = QueryBuilder.start("user.id").is("userId"); 
DBCursor cursor = mongoClient.find(builder.get()) 

while (cursor.hasNext()){ 
    DBObject user = cursor.next(); 
    BasicDBList subscriptions = (BasicDBList)JSONParser.parseObject(user, "user.subscriptions"); 

    subscriptions.add(subscriptionDBObject); 

    DBObject updateSubs = new BasicDBObject(); 
    updateSubs.put("$set", new BasicDBObject("subscriptions" : subscriptions); 

    mongoClient.update(user, updateSubs); 
} 

這會運行,但用戶從不編輯,並且WriteResult返回「updatedExisting」:false。如果有人能告訴我我在這裏做錯了什麼,我將不勝感激。

感謝

回答

1

我不熟悉的Java驅動程序,所以我不會建議任何代碼,但我相信你正在尋找蒙戈的Array Update Operators。我認爲$push$addToSet運營商將滿足您的需求。

蒙戈的使用$推例如:

db.students.update(
    { _id: 1 }, 
    { $push: { scores: 89 } } 
) 

,請務必瞭解MongoDB中使用增長的嵌入式陣列的性能影響。看到這裏:Why shouldn't I embed large arrays in my documents?

你也許會發現這篇文章有幫助:Thinking About Arrays In Mongodb