0
votes

Requête de la recherche de MongoDB sur la matrice en résultat unique

Je suis en train d'exécuter une requête de recherche à l'aide de $ le déroulement afin de trouver tous les éléments de tableau des éléments d'un champ de matrice d'une collection jointe à une autre collection. J'utilise la requête ci-dessous: xxx pré>

Les résultats réels sont p> xxx pré>

en raison de l'annotation de détente, est-il possible que j'ai un résultat Ci-dessous: P>

{
    "_id" : ObjectId("5bfe8978192b5c14e8d88ba7"),
    "Producttypes" : [ 
        {
            "offeringType" : ["package A","package B"]
        }
    ]
}


3 commentaires

Votre sortie attendue n'est pas un JSON valide. Essayer de le réparer


Pourquoi avez-vous d'abord $ vous dérouler les fournisseurs? C'est un tableau scalaire afin que vous puissiez simplement faire une recherche de $ en fonction de cela. Le résultat sera une matrimonie, vous n'aurez pas besoin de faire un groupe $ après.


De plus, vous ne pouvez pas que $ groupe après $ Cherchez ici car vous vous retrouverez avec des tableaux.


3 Réponses :


1
votes

3 commentaires

Merci @Elhil, après une lecture attentive sur Docs.MONGODB. COM / Manual / Référence / Opérateur / Agréggation / GROUPE / ... La requête finale est la suivante: dB.getCollection ('Produits'). Agrégat ([{$ Doulez-vous: "$ fournisseur"}, {$ Recherche: {à partir de: "Offres", localfield: "fournisseurOffers", étrangerfield: "_ id", comme suit: "Productypes"}}, {$ Groupe: {_ID: "$ _ID", OffreType: {$ addtoset: '$ productypes .OfferingType '}}}, {$ Trier: {_ID: 1}}])


Heureux de pouvoir aider @ user2829319, merci de nous avoir donné le résultat final :)


Cela ne vous donnera pas la gamme de types d'offres, cela vous donnera une gamme de matrices.



1
votes

Ceci s'avère être plus simple en avant si vous n'avez pas d'abord d'abord $ Doulez-vous les documents originaux. $ lookup est capable de rechercher directement à partir d'un tableau de "touches étrangères" et du résultat sera déjà un tableau déjà, évitant que la nécessité d'avoir un autre $ se dérouler et < Code> $ Group après. XXX

Eventuellement si vous souhaitez transformer le produit des produits pour avoir le champ OFFERTTYPE, vous pouvez ajouter {$ addfields: {Productypes: '$ Productypes.cfreingtype'}}}}


0 commentaires

0
votes

Je suis d'accord que l'agrégation est une fonctionnalité excellente et essentielle, Mais parfois, cela nous rend difficiles à contrôler de petits mais spécifiques changements.

Je recommande donc à Meteor.js que "cela.Ajouté" quelque chose comme ci-dessous pourrait être l'une des bonnes solutions sans agrégation. P>

# Writing in Coffeescript
Meteor.publish 'pubName' ->
  cursor = Products.find()
  cursor.forEach (product) => #fat arrow for this binding
    #Play anything with product and the other collection's data
    product.Producttypes = Offers.findOne(_id: product.SupplierOffers)
    this.added('pubName', product._id, product) #The data binded to Products could be use in client
  return [
    cursor
    OtherCollection.find() #other collections to subscribe
  ]


0 commentaires