Disons que j'ai une collection, comme ceci:

[
{ "_id": "101",  parts: [1.2, 2] },
{ "_id": "102",  parts: [2, 3.5] },
{ "_id": "103",  parts: [4.1, 10] }
]

Quelle requête dois-je écrire pour que chaque élément du tableau parts soit supérieur à celui de l'élément avec le même index de tableau dans un tableau d'entrée [1, 5]?

La sortie serait:

[
{ "_id": "103",  parts: [4.1, 10] } // 4.1 >= 1 and 10 >= 5
]

Est-ce possible? une idée?

1
blueseal 16 sept. 2020 à 11:46

2 réponses

Meilleure réponse

Vous pouvez utiliser la notation par points et exécuter la requête suivante pour votre exemple:

{"parts.0":{"$gte":1},"parts.1":{"$gte":5}}

Aire de jeux de Mongo

Ou utilisez le code JS ci-dessous pour créer quelque chose de plus générique:

let input = [1,5];
let query = Object.fromEntries(input.map((val, i) => ([ "parts." + i, { $gte: val } ])));

console.log(query);
1
mickl 16 sept. 2020 à 09:02

Si vous connaissez le tableau d'entrée avant la requête, vous pouvez d'abord créer un objet de requête à partir de celui-ci, puis passer cet objet à la requête:

let query = input.reduce((acc, cur, index) => {
  acc['parts.' + index] = { $gt: cur };
  return acc;
}, {});
// [1, 5] will create {"parts.0": {$gt: 1},"parts.1": {$gt: 5}}
db.collection.find(query)...
1
Cuong Le Ngoc 16 sept. 2020 à 09:02