За съжаление това все още не е налично като част от рамката за обобщаване. Въпреки това, според този билет на JIRA, в момента той е „планиран от непланиран“. Единственият начин да направите това в момента е чрез използване на функцията map/reduce. Ако искате да продължите и да използвате това, това би означавало да направите нещо както следва:
- Картирайте всеки документ по _id и излъчете съответния ключ.
- Тъй като ще има само една стойност на ключ, функцията за намаляване няма да бъде извикана, но все пак трябва да инициализирате променливата, която използвате за функцията за намаляване. Можете да използвате празна функция или празен низ.
- Стартирайте map/reduce, запазвайки резултатите в колекция по ваш избор.
В обвивката mongo
изглежда по следния начин:
var mapper = function() {
var typeValue = this.types[this.default];
emit(this._id, typeValue);
};
var reducer = "";
db.types.mapReduce(mapper, reducer, { out : "results" } );
Ако след това направите запитване към колекцията от резултати, ще получите нещо, както следва:
> db.results.find();
{ "_id" : ObjectId("53d21a270dcfb83c7dba8da9"), "value" : 1 }
Ако искате да знаете каква е стойността по подразбиране, можете да промените функцията mapper
, за да върнете ключа също като стойност. Ще изглежда нещо подобно:
var mapper = function() {
var typeValue = this.types[this.default],
typeKey = "types." + this.default;
emit(this._id, { key : typeKey, val : typeValue } );
};
Когато се стартира, това ще доведе до резултати, които изглеждат както следва:
> db.results.find().pretty();
{
"_id" : ObjectId("53d21a270dcfb83c7dba8da9"),
"value" : {
"key" : "types.x",
"val" : 1
}
}
Имайте предвид, че това вероятно е много по-сложно решение, отколкото бихте искали, но това е единственият начин да направите това с помощта на MongoDB, без да добавяте повече логика към вашето приложение.
person
Juan Carlos Farah
schedule
25.07.2014