2017-09-18 1 views
0

J'ai une collection de produits. Chaque produit contient un tableau d'éléments d'historique.MongoDB Exclure les documents du résultat trouvé en fonction des valeurs d'un sous-document

{ 
    "_id" : "product1" 
    "name" : "Product 1", 
    "history" : [ 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 0, 
       "status": "New" 
     }, 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 0, 
       "diff": [] 
     } 
    ] 
} 
{ 
    "_id" : "product2" 
    "name" : "Product 2", 
    "history" : [ 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 1, 
       "status": "New" 
     }, 
     { 
       "date" : "2017-09-18 11:49:03.000", 
       "processed" : 0, 
       "diff": [] 
     } 
    ] 
} 

je peux trouver tous les produits qui sont nouveaux et ont une histoire qui n'a pas été traitée en utilisant la requête suivante MongoDB:

db.products.find(
    { 
     "history": { 
      $elemMatch: { 
       "processed": {$eq: 0}, 
       "status": {$eq: "New"} 
      } 
     } 
    } 
) 

Mais je ne peux pas comprendre comment trouver le ceux où:

  • Il dispose d'un élément d'histoire qui doit être traitée "processed": {$eq: 0}
  • ne contient pas un élément de l'histoire qui a une sta tus de "new" et une valeur traitée de "0"

Donc, il devrait ramener "product2" et non "product1" car product1 doit être manipulé différemment.

Toute aide est grandement appréciée :-)

Répondre

0

vous obtenez seulement product 1 en sortie parce que vous faites une recherche and pour les processed et status champs qui correspondent à seulement product 1. Si vous voulez product 2 out aussi basé uniquement sur le champ processed alors vous devez utiliser $or requête.

Vérifiez requête suivante, il retournera à la fois product 1 et product 2

{ 
    "history": { 
     $elemMatch: { 
      $or:[ 
       {"processed": {$eq: 0}}, 
       {"status": {$eq: "New"}}] 
     } 
    } 
} 

mis à jour la requête en fonction de votre explication dans les commentaires.

.find({ 
    $and:[{ 
     "history": { 
      $not: { 
       $elemMatch: { 
        "processed": {$eq: 0}, 
        "status":{$eq: "New"} 
       } 
      } 
     } 
    }, 
    {"history.processed":0} 
]}) 
+0

Merci pour votre réponse. J'ai réellement besoin de deux requêtes (je veux les manipuler séparément) une qui retournera juste 'product1' que je peux faire avec la requête dans ma question mais je ne peux pas comprendre comment retourner juste' product2' dans une requête séparée basée sur le fait que son élément d'historique pour le statut nouveau a été traité mais qu'il contient un autre élément d'historique qui n'a pas été traité. Je reçois toujours 'product1' aussi bien! – Phil

+0

est donc toujours «produit 1» et «produit 2» ou vous voulez une requête sur d'autres paramètres. pouvez-vous s'il vous plaît expliquer cela dans un peu plus de détails. – Ricky

+0

Il y aura plus de 1000 produits dans la collection au total, importés depuis un système séparé. J'importe ces derniers dans mongo et suivis les changements comme éléments d'histoire. Je veux être en mesure de récupérer à travers deux requêtes différentes: - Première requête: Produits qui ont un statut de nouveau (ce que je peux faire avec la question dans ma question) (produit 1 seulement) - 2ème requête: Produits qui ont des éléments d'histoire doivent être exportés traités = 0 mais n'ont pas de statut nouvel article d'historique qui a besoin d'exporter (produit 2 seulement). Donc, je veux trouver des éléments de l'historique où traité = 0 et aucun de ceux-ci ont le statut = nouveau – Phil