2015-04-22 1 views
1

J'ai une table d'utilisateurs dans MongoDB où le format ressemble à ceci:MongoDB mise à jour de requête liste imbriquée des objets

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

Je voudrais ajouter un objet d'abonnement à ce tableau nommé « abonnements. » Voici à quoi ressemble mon code et cela ne fonctionne pas. Mon JSONParser dans ce cas fonctionne et renvoie le tableau correct.

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); 
} 

Ceci s'exécute mais l'utilisateur n'est jamais édité et WriteResult retourne "updatedExisting": false. J'apprécierais grandement que quelqu'un puisse me dire ce que j'ai fait de mal ici.

Merci

Répondre

1

Je ne connais pas avec le pilote Java, donc je ne suggéreront pas un code, mais je crois que vous cherchez Array Update Operators de mongo. Je pense que l'opérateur $push ou $addToSet répondra à vos besoins.

exemple de Mongo pour utiliser push $:

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

Assurez-vous de comprendre les implications sur les performances de l'utilisation des réseaux intégrés de plus en plus dans MongoDB. Voir ici: Why shouldn't I embed large arrays in my documents?

Vous pouvez également trouver ce poste utile: Thinking About Arrays In Mongodb