Tengo que seleccionar distintos registros de mi simple mongo db base de datos.
Tengo muchos simples registros de estos registros se parece a esto :

{"word":"some text"}

Mi código es muy simple.

    const string connectionString = "mongodb://localhost";
    var client = new MongoClient(connectionString);

    MongoServer server = client.GetServer();
    MongoDatabase database = server.GetDatabase("text8");
    MongoCollection<Element> collection = database.GetCollection<Element>("text8");
    MongoCursor<Element> words = (MongoCursor<Element>)collection.FindAll();

Pero no tengo idea de cómo seleccionar distintos de la palabra a partir de la base de datos.
Podría alguien me puede dar algunos consejos ?

  • ¿Desea dividir sus registros en las palabras por separado y volver a estas palabras distintas o simplemente devolver valores distintos para word clave?
  • No, mi intención id para seleccionar irrepetible palabras de colección.
InformationsquelleAutor Konrad | 2013-11-03

5 Comentarios

  1. 9

    MongoDB API tiene un > distintos agregación de comando, que devuelve distintos valores de una clave especificada en una colección. También se puede utilizar de C# Controlador:

    var distinctWords = collection.Distinct("word");

    donde collection – es una instancia de su ejemplo. Esta consulta devolverá todos los valores distintos de word campo en la colección.

    También, como @JohnnyHK mencionado en el comentario, puede utilizar linq enfoque, ya que es compatible con C# controlador:

    var distinctWords = collection.AsQueryable<Element>().Select(e => e.Word).Distinct();
    • El LINQ de la interfaz proporcionada por el C# controlador ejecuta sus consultas a través de MongoDB, por lo que no se recuperan todos los registros y luego filtrado en el código y normalmente es igual de eficiente.
    • gracias por tu corrección. Yo realmente pensaba acerca de la compatibilidad de linq en C# controlador, pero no estaba del todo seguro. He corregido respuesta.
  2. 1

    Mi conjetura sería hacer de la «palabra» de un índice en este db.
    A continuación, el uso de algunos linq para consultar en una simple expresión:
    var res = col.Query().Seleccione(e => e.palabra).Distintos();

    Esto podría resultar en la lectura de todas las palabras del índice.

    • Gracias Yo por la respuesta pero no funciona, I ‘v consiguió excepción.
  3. 0

    MongoDB no han construido en un operador para dividir una cadena de palabras a partir de una consulta ya que no hay una manera de dividir una cadena, a continuación, ejecutar una «distinta de la» operación.

    Una opción sería crear un MapReduce y hacer la división en la MapReduce código y contar cada palabra. Usted no puede hacer esto solo con código C#.

    Un segundo, y posiblemente la opción más simple sería pre-dividir el campo en palabras de modo que usted puede utilizar uno de los distintas operadores:

    { "word": [ "some", "text"] }

    A continuación:

    dbCollection.Distinct("word");

    Este sería, por supuesto, el trabajo si usted sólo quiere tratar a toda la cadena como una «palabra» en lugar de que cada palabra por separado
    .
    MapReduce no son en tiempo real … el pseudo-código sería el siguiente:

    map = function() {
      var splits = this.word.split(' ');
      for(var i = 0, l = splits.length; i < l; i++) {
         emit(splits[i], 1);
      }
    }
    
    reduce = function(word, vals) {
       var count = 0;
       for(var i=0, l=vals.length; i < l; i++) {
           count += vals[i];
       }
       return count;
    }

    Cuando se ejecuta el MapReduce, sería una recopilación del número de ocurrencias de cada palabra.

  4. 0

    Si quieres filtro primero y obtener distintos y después también de hacer todas estas en MongoDB lado, usted puede utilizar el ejemplo siguiente.
    En este ejemplo he aplicado un filtro, obtuvo valores distintos y, finalmente, tiene en cuenta:

            var filter = Builders<Logs>.Filter.Ne(x => x.Id, null);
            var count = collection.Distinct(x => x.Id, filter).ToList().Count();

Dejar respuesta

Please enter your comment!
Please enter your name here