2017-09-07 3 views
0

J'ai une collection MongoDB orders, les documents dont se présenter comme suit:Comparer des propriétés de tableau à propriété unique dans le document

[{ 
    "_id" : ObjectId("59537df80ab10c0001ba8767"), 
    "shipments" : { 
     "products" : [ 
      { 
       "orderDetails" : { 
        "id" : ObjectId("59537df80ab10c0001ba8767") 
       } 
      }, 
      { 
       "orderDetails" : { 
        "id" : ObjectId("59537df80ab10c0001ba8767") 
       } 
      } 
     ] 
    }, 
} 
{ 
    "_id" : ObjectId("5953831367ae0c0001bc87e1"), 
    "shipments" : { 
     "products" : [ 
      { 
       "orderDetails" : { 
        "id" : ObjectId("5953831367ae0c0001bc87e1") 
       } 
      } 
     ] 
    }, 
}] 

maintenant, de cette collection, je veux filtrer les éléments qui, l'une des valeurs à shipments.products.orderDetails.id chemin est la même que la valeur à _id chemin.

J'ai essayé:

db.orders.aggregate([{ 
    "$addFields": { 
     "same": { 
      "$eq": ["$shipments.products.orderDetails.id", "$_id"] 
     } 
    } 
}]) 

pour ajouter un champ same comme un indicateur pour déterminer si les valeurs sont égales, mais la valeur de same vient comme false pour tous les documents.

EDIT Ce que je veux faire est de comparer le champ _id les documents avec toutes shipments.products.orderDetails.id valeurs dans le tableau. Si même un des shipments.products.orderDetails.id correspond à la valeur du champ _id, je souhaite que ce document figure dans le résultat final. J'utilise MongoDB 3.4 et je dois utiliser le pipeline d'agrégation.

+0

Quelle est votre intention réelle? La propriété que vous comparez est dans un "tableau" donc qu'est-ce qui est supposé être retourné si l'un des membres du tableau est différent? Pourquoi voulez-vous que cette valeur logique soit renvoyée? Parce que si votre intention est de "sélectionner" ou dicarder les conditions "vrai/faux", alors il y a un meilleur moyen. Cela n'aide pas vraiment que les seules données de la question correspondent toujours entre les deux valeurs. –

+0

Je veux tous les éléments dans lesquels le champ '_id' existe en dehors des éléments du tableau –

+0

Vous venez de recevoir quelques questions détaillées. Commenter avec une ligne qui n'explique pas mieux que votre question n'aide pas. Le long commentaire est parce que votre question n'est pas claire. Rendez-le plus clair. –

Répondre

1

Votre tentative actuelle échoue car la notation renvoie un "tableau" en comparaison avec une "valeur unique".

Ainsi, au lieu soit utiliser $in lorsqu'elles sont disponibles, qui permet de comparer pour voir si une valeur est « dans » un tableau:

db.orders.aggregate([ 
    { "$addFields": { 
    "same": { 
     "$in": [ "$_id", "$shipments.products.orderDetails.id" ] 
    } 
    }} 
]) 

ou annoter les deux sous forme de tableaux en utilisant $setIsSubset

db.orders.aggregate([ 
    { "$addFields": { 
    "same": { 
     "$setIsSubset": [ "$shipments.products.orderDetails.id", ["$_id"] ] 
    } 
    }} 
]) 

Où en dans ce cas, il fait une comparaison pour voir si les "ensembles" ont une "intersection" qui fait _id le "sous-ensemble" du tableau de valeurs.

Les deux cas retournera true quand « tout » des propriétés id dans les entrées de tableau dans le chemin spécifié sont un match pour la propriété _id du document.