2017-02-01 1 views
2

J'ai besoin d'effectuer une sélection de documents MongoDB en utilisant $in comme documenté https://docs.mongodb.com/manual/reference/operator/query/in/

{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }

J'ai essayé avec cela, mais

conditions := { 'conditionIds' -> {'$in' -> [ 'uQqazzdwSYsEmqGNp' ] } asDictionary } asDictionary. collection := database collectionAt: 'users'. collection query: [ :q | q where: conditions ].

j'ai vu que MQInCondition existe, ce qui est très prometteur, mais j'ai échoué à trouver un exemple dans les tests ou les documents du projet. Quelqu'un sait comment l'utiliser? Merci!

Répondre

2

Vous avez confondu [] en tant qu'initialisateur de tableau alors que dans smalltalk il s'agit de blocs. Utilisez simplement {} à la place. Lorsque vous utilisez la requête: aBlock version, vous utilisez des expressions smalltalk à l'intérieur du bloc. Mais la quantité d'expressions que vous pouvez utiliser est assez limitée et ne supporte pas $ à

+0

Merci Norbert. Mais nous avons «MQInCondition», de quoi aurait-il besoin pour que ça marche? –

+0

Pour l'enregistrement: J'avais besoin que les valeurs de la requête soient paramétrées (c'est un tableau qui vient en argument) donc je ne peux pas vraiment utiliser '{val1. val2} asDictionary' –

+0

Donc il suffit de mettre le tableau au lieu de {val1. val2}. –

1

J'ai trouvé une erreur de syntaxe sur le tableau de l'argument dans ma tentative précédente et l'idée était généralement bonne. C'est celui qui fonctionne:

conditions := { 'conditionIds' -> {'$in' -> #('uQqazzdwSYsEmqGNp') } asDictionary } asDictionary. collection := database collectionAt: 'users'. collection query: [ :q | q where: conditions ].

4

Vous pouvez utiliser le 1: 1 cartographiés javascript syntaxe (transmission par exemple les répertoires) ou utiliser MQuerry à « automagiquement » construire des requêtes. Exemple ci-dessous:

mongo := Mongo default open. 
db := mongo databaseNamed: 'playground'. 
col := db getCollection: 'test'. 


col add: {'field' -> 'value1'} asDictionary; 
    add: {'field' -> 'value2'} asDictionary. 

col select: { ('field' -> { '$in' -> #('value1' 'value2') } asDictionary)}. "The javascript way" 
col select: [ :each | (each at: 'field') in: #('value1' 'value2') ] "The Smalltalk way" 
col select: [ :each | (each field) in: #('value1' 'value2') ]. "Even Smalltalkier :-)"