Der einfachste Weg, ohne Meteor-Code zu bearbeiten, ist die Verwendung Ihrer eigenen Mongodb. Ihre mongodb.conf
sollte in etwa so aussehen (unter Arch Linux ist es unter /etc/mongodb.conf
zu finden )
bind_ip = 127.0.0.1
quiet = true
dbpath = /var/lib/mongodb
logpath = /var/log/mongodb/mongod.log
logappend = true
setParameter = textSearchEnabled=true
Die Schlüsselzeile ist setParameter = textSearchEnabled=true
, das, wie es heißt, die Textsuche ermöglicht.
Starten Sie mongod
nach oben
Sagen Sie Meteor, dass er Ihren mongod
benutzen soll nicht seine eigene, indem Sie die MONGO_URL
angeben Umgebungsvariable.
MONGO_URL="mongodb://localhost:27017/meteor" meteor
Angenommen, Sie haben eine Sammlung mit dem Namen Dinosaurs
deklariert sagen in collections/dinosaurs.js
Dinosaurs = new Meteor.Collection('dinosaurs');
Um einen Textindex für die Sammlung zu erstellen, erstellen Sie eine Datei 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
});
});
Dann können Sie die Suche durch eine Meteor.method
verfügbar machen , zum Beispiel in der Datei 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;
}
};
Dann können Sie nur Dokumente veröffentlichen, die in 'server/publications.js'
gesucht wurdenMeteor.publish('dinosaurs', function(searchText) {
var doc = {};
var dinosaurIds = searchDinosaurs(searchText);
if (dinosaurIds) {
doc._id = {
$in: dinosaurIds
};
}
return Dinosaurs.find(doc);
});
Und das clientseitige Abonnement würde in client/main.js
etwa so aussehen
Meteor.subscribe('dinosaurs', Session.get('searchQuery'));
Props an Timo Brinkmann dessen musiccrawler project war die Quelle dieses Wissens.