2016-09-11 1 views
1

TLDR: Le plus gros problème auquel je suis confronté est que je ne vois pas comment filtrer un objet dans un tableau par une clé qui est imbriquée dans l'un de ses objets.Filtrer un objet dans array par id dans rethinkdb

En supposant un schéma avec cette structure:

{ 
    some_field: "value", 
    some_array: [ 
    { 
     item: { 
      id: "some rethinkdb key", 
      name: "some object" 
     }, 
     relevant_field: { 
      id: "some rethinkdb key", 
      name: "so relevant", 
      properties: [ 
      { 
       id: "target key", 
       count: 2 
      }, 
      { 
       id: "some other rethinkdb key", 
       count: 1 
      }, 
      ] 
     } 
    }, 
    { 
     item: ... 
    } 
    ] 
} 

Le problème est le suivant: Je souhaite mettre à jour le « comptage » champ à l'intérieur des propriétés d'un objet à l'intérieur some_array avec id 'clé cible. Le meilleur moyen que j'ai trouvé jusqu'ici est de trouver la position dans 'some_array' de l'item que je souhaite mettre à jour, puis d'appliquer la méthode trouvée dans cette question, fournie par la réponse acceptée: How to update embedded document?. J'ai utilisé avec succès cette même méthode sur d'autres problèmes, mais pas dans celui-ci.

EDIT: Correction de la structure json grâce au commentaire de mlucy.

+1

Je vais avoir du mal à comprendre votre exemple. Les objets dans 'some_array' semblent avoir deux champs, tous les deux ont' id's, et la syntaxe pour 'properties' est incorrecte (je ne peux pas savoir si c'est supposé être un tableau ou un objet). – mlucy

+0

@mlucy Merci, c'était en effet une erreur. Properties est un tableau d'objets, et je veux mettre à jour un de ces objets par id. –

Répondre

0

Vous pouvez écrire:

table.update(function(row) { 
    return {some_array: row('some_array').map(function(el) { 
    return {relevant_field: {properties: el('relevant_field')('properties').map(function(prop) { 
     return r.branch(prop('id').eq('target key'), prop.merge({count: prop('count').add(1)}), prop); 
    })}}; 
    })}; 
}) 
+0

J'ai testé ce code, et le nombre n'est pas augmenté. En outre, il ne filtre à aucun moment pour mettre à jour seulement un objet some_array spécifique, mais essaie plutôt de les mettre à jour tous. Désolé, il m'a fallu si longtemps pour répondre à cette réponse. –