Je suis nouveau à mongodb.
Dans la requête de recherche J'utilise la structure suivante: p> Toutefois, la liste de comptes contient plusieurs valeurs, et ainsi fait Liste des transactions, la requête exacte serait: p> 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 voici la sortie: p> Et j'aimerais quelque chose comme ça, où je ne saisis que le chemin d'accès où la condition est remplie: p>
3 Réponses :
Essayez cette requête:
db.report.find({'accountList[0].transactionList[4].description': /.*aear.*/i}).limit(1)
Je doute que cela fonctionne depuis de la rendre irable sur de nombreux fichiers qu'il ne devrait pas contenir la position exacte [0] code> et
[4] code>. Merci pour votre réponse
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"
}
]
}
]
}
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 .
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" } } }} ])
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}
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 code> et
transaction de transaction code> à l'intérieur du même document:
{"ID": "4474", "TransactionListList": [{"Description": "Aear"}, {"Description": "koe"}], "id": "4475", "transactionlist": [{"Description": "oho"}, {"Description": "koe"}]} code>. Pourriez-vous publier la structure réelle d'un document à l'intérieur de la collection
Signaler code>, 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