2015-04-22 136 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