Je dirais utiliser Map-Reduce
pour créer une collection séparée qui stocke le genre
sous forme de tableau avec des valeurs provenant de la chaîne séparée par des virgules, que vous pouvez ensuite exécuter le travail Map-Reduce et administrer les requêtes sur la collection de sortie.
Par exemple, j'ai créé des exemples de documents pour le foo
collecte :
db.foo.insert([
{genre: 'Action, Adventure, Sci-Fi'},
{genre: 'Thriller, Romantic'},
{genre: 'Comedy, Action'}
])
L'opération map/reduce suivante produira alors la collection à partir de laquelle vous pourrez appliquer des requêtes performantes :
map = function() {
var array = this.genre.split(/\s*,\s*/);
emit(this._id, array);
}
reduce = function(key, values) {
return values;
}
result = db.runCommand({
"mapreduce" : "foo",
"map" : map,
"reduce" : reduce,
"out" : "foo_result"
});
L'interrogation serait simple, tirant parti des requêtes avec un index multi-clé sur la value
champ :
db.foo_result.createIndex({"value": 1});
var genre = ['Action', 'Adventure'];
db.foo_result.find({'value': {'$in': genre}})
Sortie :
/* 0 */
{
"_id" : ObjectId("55842af93cab061ff5c618ce"),
"value" : [
"Action",
"Adventure",
"Sci-Fi"
]
}
/* 1 */
{
"_id" : ObjectId("55842af93cab061ff5c618d0"),
"value" : [
"Comedy",
"Action"
]
}