sql >> Base de Datos >  >> NoSQL >> MongoDB

Implementando la búsqueda de texto completo de MongoDB 2.4 en una aplicación Meteor

La forma más sencilla sin editar ningún código Meteor es usar su propio mongodb. Tu mongodb.conf debería verse así (en Arch Linux se encuentra en /etc/mongodb.conf )

bind_ip = 127.0.0.1
quiet = true
dbpath = /var/lib/mongodb
logpath = /var/log/mongodb/mongod.log
logappend = true
setParameter = textSearchEnabled=true

La línea clave es setParameter = textSearchEnabled=true , que, como dice, permite la búsqueda de texto.

Iniciar mongod arriba

Dile a Meteor que use tu mongod no es propio especificando el MONGO_URL variable ambiental.

MONGO_URL="mongodb://localhost:27017/meteor" meteor

Ahora digamos que tienes una colección llamada Dinosaurs declarado decir en collections/dinosaurs.js

Dinosaurs = new Meteor.Collection('dinosaurs');

Para crear un índice de texto para la colección, cree un archivo server/indexes.js

Meteor.startUp(function () {
    search_index_name = 'whatever_you_want_to_call_it_less_than_128_characters'

    // Remove old indexes as you can only have one text index and if you add 
    // more fields to your index then you will need to recreate it.
    Dinosaurs._dropIndex(search_index_name);

    Dinosaurs._ensureIndex({
        species: 'text',
        favouriteFood: 'text'
    }, {
        name: search_index_name
    });
});

Luego puede exponer la búsqueda a través de un Meteor.method , por ejemplo en el archivo server/lib/search_dinosaurs.js .

// Actual text search function
_searchDinosaurs = function (searchText) {
    var Future = Npm.require('fibers/future');
    var future = new Future();
    Meteor._RemoteCollectionDriver.mongo.db.executeDbCommand({
        text: 'dinosaurs',
        search: searchText,
        project: {
          id: 1 // Only take the ids
        }
     }
     , function(error, results) {
        if (results && results.documents[0].ok === 1) {
            future.ret(results.documents[0].results);
        }
        else {
            future.ret('');
        }
    });
    return future.wait();
};

// Helper that extracts the ids from the search results
searchDinosaurs = function (searchText) {
    if (searchText && searchText !== '') {
        var searchResults = _searchEnquiries(searchText);
        var ids = [];
        for (var i = 0; i < searchResults.length; i++) {
            ids.push(searchResults[i].obj._id);
        }
        return ids;
    }
};

Luego puede publicar solo los documentos que se han buscado en 'server/publications.js'

Meteor.publish('dinosaurs', function(searchText) {
    var doc = {};
    var dinosaurIds = searchDinosaurs(searchText);
    if (dinosaurIds) {
        doc._id = {
            $in: dinosaurIds
        };
    }
    return Dinosaurs.find(doc);
});

Y la suscripción del lado del cliente se vería así en client/main.js

Meteor.subscribe('dinosaurs', Session.get('searchQuery'));

Apoyos para Timo Brinkmann cuyo proyecto de musiccrawler fue la fuente de la mayor parte de este conocimiento.