2013-03-01 6 views
0

J'ai un DB Mongo COLLeCTION comme le montreMongoDB: Comment faire une requête dans Array Structured Collection.

{ 
    "name": "SAM", 
    "collection": [ 
     { 
      "date": "2013-03-16", 
      "values": [ 
       { 
        "price": "24.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-04-20", 
      "values": [ 
       { 
        "price": "10.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-05-18", 
      "values": [ 
       { 
        "price": "12.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-06-22", 
      "values": [ 
       { 
        "price": "10.0" 
       } 
      ] 
     }, 
     { 
      "date": "2013-09-21", 
      "values": [ 
       { 
        "price": "38.0" 
       } 
      ] 
     } 
    ] 
} 

Je tentais d'obtenir des données relatives à une date particulière (16/03/2013) comme indiqué Mais je reçois des données de toutes les dates.

C'est ce que j'ai essayé.

S'il vous plaît dites-moi où je fais erreur.

package com; 

import java.net.UnknownHostException; 

import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.DBCursor; 
import com.mongodb.Mongo; 

public class Test { 

    public static void main(String args[]) throws UnknownHostException { 
     Mongo mongo = new Mongo(); 
     DB db = mongo.getDB("test"); 
     DBCollection mycollection = db.getCollection("mycollection"); 

     BasicDBObject query = new BasicDBObject(); 
     query.put("name", "SAM"); 
     query.put("collection.date", "2013-03-16"); 

     DBCursor cursor = mycollection.find(query); 

     while (cursor.hasNext()) { 
      System.out.println(cursor.next()); 
     } 

    } 

} 
+0

MongoDB retourne l'ensemble du dossier et non un sous-ensemble d'un disque lors d'une requête. Votre "collection" ci-dessus semble être un seul enregistrement. Vous pourriez essayer de décomposer ceci en dossiers individuels, chacun avec le nom, la date et les valeurs. –

+0

Si vous devez utiliser le tableau incorporé pour votre schéma, vous pouvez utiliser l'opérateur '$ unwind' du cadre d'agrégation pour découper le document unique en un document par entrée dans le tableau incorporé. – slee

+0

Merci pour la réponse, mais je ne peux pas changer la structure de la base de données. Donc, vous voulez dire qu'il n'est pas possible d'éviter le retour de tout le dossier. – Pawan

Répondre

1

Vous pouvez utiliser le $ opérateur de projection de position pour ce faire dans le paramètre de sélection de champ de find:

BasicDBObject query = new BasicDBObject(); 
query.put("name", "SAM"); 
query.put("collection.date", "2013-03-16"); 
BasicDBObject fields = new BasicDBObject(); 
fields.put("name", 1); 
fields.put("collection.$", 1); 

DBCursor cursor = mycollection.find(query, fields); 
+0

Cela fonctionne, mais pourriez-vous s'il vous plaît me dire pourquoi vous avez codé en dur 1 pour les clés de nom et de collection? – Pawan

+0

@PreethiJain Parce que la valeur des clés dans le paramètre de sélection de champ détermine si le champ est inclus dans le résultat; 1 (ou toute valeur véridique) pour inclus, 0 pour exclu. – JohnnyHK

+0

ce que j'ai compris est que le nom et la collection de fileds. $ Feront partie du résultat ?? Ai-je raison . S'il vous plaît dites-moi – Pawan

0

Vous essayez d'interroger un élément dans la collection de tableau, vous devez utiliser elemMatch $, au lieu de,

query.put("collection.date", "2013-03-16"); 

vous pouvez essayer avec

query.put("collection", new BasicDBObject("$elemMatch", new BasicDBObject("date","2013-03-16"))); 

En savoir plus à ce sujet ici: http://docs.mongodb.org/manual/reference/projection/elemMatch/

+0

Merci Vikas, j'ai essayé mais je reçois toutes les dates comme réponse. – Pawan

+0

Comme JohnnyHK l'a mentionné dans son code, vous devez également passer un nouveau BasicDBObject ("collection. $", 1); dans la méthode find pour obtenir une entrée particulière, voici le doc pour l'opérateur $: http://docs.mongodb.org/manual/reference/projection/positional/#_S_ – vikasing

Questions connexes