-1
votes

Mongodb garde le chemin où un critère est rempli

Je suis nouveau à mongodb.

Dans la requête de recherche J'utilise la structure suivante: xxx

Toutefois, la liste de comptes contient plusieurs valeurs, et ainsi fait Liste des transactions, la requête exacte serait: xxx

Le problème est que la liste de comptes a plusieurs comptes, et une seule d'entre elles a la valeur "Aear" dans la description. Lorsque j'exécute la requête, cela me renvoie les deux comptes et je voudrais garder uniquement le compte où est dans sa description. En outre, cela doit être démonérable sur plusieurs fichiers, car le fichier informatique a des listes de transaction différentes, donc dans certains documents asear ne figurera pas du tout et, dans d'autres, il peut apparaître plusieurs types. , toujours dans différentes positions. Je crois que quelque chose doit être fait dans la projection, mais la définition comme ça ne fonctionne pas: xxx

voici la sortie: xxx

Et j'aimerais quelque chose comme ça, où je ne saisis que le chemin d'accès où la condition est remplie: xxx


4 commentaires

Salut! Êtes-vous sûr que le JSON soit retourné sur votre requête? Il a des données en double. Vous ne devriez pas avoir deux id et transaction de transaction à l'intérieur du même document: {"ID": "4474", "TransactionListList": [{"Description": "Aear"}, {"Description": "koe"}], "id": "4475", "transactionlist": [{"Description": "oho"}, {"Description": "koe"}]} . Pourriez-vous publier la structure réelle d'un document à l'intérieur de la collection Signaler , s'il vous plaît?


Bien sûr, je vais éditer ma réponse


Là, j'ai fini la modification.


Merci. Vérifiez ma réponse si vous n'avez pas encore trouvé de solution


3 Réponses :


0
votes

Essayez cette requête:

db.report.find({'accountList[0].transactionList[4].description': /.*aear.*/i}).limit(1)


1 commentaires

Je doute que cela fonctionne depuis de la rendre irable sur de nombreux fichiers qu'il ne devrait pas contenir la position exacte [0] et [4] . Merci pour votre réponse



1
votes

Mise à jour de ma réponse Comme cette question a été mise à jour avec la nouvelle requête O / P:

Réponse de la nouvelle question: strong> p>

Si vous n'avez qu'une transaction correspondant à Critères /.* AEAR. * / I CODE>, disons la description est unique dans Liste de comptes forte> Tableau du document de rapport (exact pour l'échantillon fourni): P>

// This first object is best example where you need aggregation

/* 1 */
{
    "_id" : ObjectId("5d6435145a0d22d3c86df1c7"),
    "accountList" : [ 
        {
            "id" : "0101",
            "transactionList" : [ 
                {
                    "description" : "aear"
                }, 
                {
                    "description" : "koe"
                }
            ]
        }, 
        {
            "id" : "1111",
            "transactionList" : [ 
                {
                    "description" : "aear"
                }, 
                {
                    "description" : "koe"
                }
            ]
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5d6435145a0d22d3c86df0d7"),
    "accountList" : [ 
        {
            "id" : "4400",
            "transactionList" : [ 
                {
                    "description" : "aear"
                }, 
                {
                    "description" : "koe"
                }
            ]
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5d6435145a0d22d3c86df077"),
    "accountList" : [ 
        {
            "id" : "0000",
            "transactionList" : [ 
                {
                    "description" : "aear"
                }, 
                {
                    "description" : "koe"
                }
            ]
        }
    ]
}

/* 4 */
{
    "_id" : ObjectId("5d6435145a0d22d3c86df0c7"),
    "accountList" : [ 
        {
            "id" : "4474",
            "transactionList" : [ 
                {
                    "description" : "aear"
                }, 
                {
                    "description" : "koe"
                }
            ]
        }
    ]
}


8 commentaires

Merci beaucoup! Je vais essayer demain!


@CeliusStingher: Cela fonctionne-t-il pour vous? Ou toujours un problème?


Cela pourrait être un peu idiot, mais je suis totalement nouveau à mongodb, je reçois ce message "" message ":" Dépassé la limite de mémoire pour $ groupe, mais n'a pas permis un tri externe. Pass AutoryDiskuse: True à opter. "Cependant, j'ai eu ceci après l'avoir essayé une seconde fois, la première fois que j'ai réussi à obtenir les résultats, mais j'ai eu la sortie complète, pas la" filtrée ".


@CeliusStingher: quelle requête avez-vous utilisée? Votre match de $ est-il fonctionnant comme prévu? Et quelle est votre image votre ensemble de données après $ match appliqué?


J'ai utilisé le deuxième code que vous proposez dans votre réponse. Je suis désolé que je pose envie de répondre longtemps. Je me suis assigné de manière spectaculaire drastiquement différente et mon attention est là maintenant. Je soulevé cela compte tenu de l'exploration et des efforts qui y sont mis, ainsi que c'est probablement correct et j'ai du mal à la mettre en œuvre.


@EcelIusStingher: Pas un problème, votre tous les documents ressemblent-ils pas à ce qui est donné en question? Lorsque «AEAR» n'est présentée qu'une fois que la liste de comptes dispose de plusieurs documents et également transactionnez la liste de comptes de compte comptant plusieurs documents? Ou pensez-vous que "AEAR" est répété à nouveau et encore dans un document? Si c'est le cas, vous pouvez utiliser la requête 1 ..


Il répète plusieurs fois, car chaque compte (au plus 4 ou 5) a beaucoup d'éléments dans sa liste de transactions (environ 10, d'autres plus de 500) et ces transactions pourraient avoir «AEAR» quelque part dans leur description, s'ils le font, Cela peut être n'importe quel nombre de fois.


Laissez-nous Continuez cette discussion en chat .



1
votes

Pour accomplir que vous devez utiliser Agrégation . Je crois que ce code fonctionnera dans votre cas:

db.report.aggregate([
  { "$match": { "accountList.transactionList.description": { $regex: "aear", $options: "i"} } },
  { "$unwind": "$accountList" },
  { "$unwind": "$accountList.transactionList" },
  { "$match": { "accountList.transactionList.description": { $regex: "aear", $options: "i"} } },
  { "$group": {
      "_id": {
          "_id": "$_id",
          "accountListId": "$accountList.id",
          "accountListType": "$accountList.type",
          "accountListCurrency": "$accountList.currency",
      },
      "transactionList": { "$push": "$accountList.transactionList" }
  }},
  { "$group": {
      "_id": "$_id._id",
      "accountList": {
          "$push": {
              "id": "$_id.accountListId",
              "type": "$_id.accountListType",
              "currency": "$_id.accountListCurrency",
              "transactionList": "$transactionList"
          }
      }
  }}
])


2 commentaires

Merci, je n'ai pas essayé cette réponse donnant au fait que AEAR peut être présent sous de nombreuses formes et doit être utilisée comme regex (asear, asear, asear, laearl, etc.)


Formidable! Merci beaucoup, je viens de modifier la partie Regex à: {$ regex: /.*war.*/i}