Това винаги е било възможно с MongoDB, защото винаги е имало възможност за конструиране на условия на заявка с помощта на Оценка на JavaScript :
db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
Където това ще върне правилно документите, които отговарят на условието тук, чрез търсене във възможните ключове в документа за необходимата стойност.
Но това всъщност не е въпрос за „възможно“, а повече от „това наистина ли е добра идея“ , за което основният отговор е „Не“.
Базите данни са непостоянни зверове, които обичат да оптимизират с неща като индекси и подобни, както и със собствен очакван набор от оператори, за да направят търсенето възможно най-ефективно за използване. Така че да, можете да преминете през езиков интерпретатор, който ефективно груба сила оценява кодирано условие във всеки документ, или можете да преразгледате своя модел на проектиране.
Базите данни обичат "реда", така че му дайте малко, тъй като има проста организирана реструктурация на данните, които предлагате:
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
Организирана по този начин, заявката става толкова проста, колкото:
db.attrs.find({ "attrs.value": "14" })
И разбира се може да поддържа и използва индекс на всяко от тези свойства на поддокумента в масива.
В крайна сметка MongoDB е „база данни“ и като всички бази данни тя е най-загрижена за „стойностите“ на нейните свойства, а не за търсене с помощта на имената на нейните „ключове“. Така че нещата, които представляват значими „данни“, не трябва да са част от името на „ключ“, а по-скоро трябва да бъдат „стойността“ на „ключ“ като „идентификатор“, както е показано по-горе.
Да имате последователен път към данните, за които искате да правите заявки, е оптималният начин за работа с данни в MongoDB. Използването на структура, в която имената на ключовете непрекъснато се променят, не може да бъде обходено от нищо друго освен изпълняван код, а това е много по-бавно и по-лошо за производителността от използването на собствените операции и улеснения като индекси.