Запрос вложенных псевдонимов с помощью Mongoose - PullRequest
0 голосов
/ 27 октября 2018

Mongoose 5.3.3 - Запрос псевдонимов на простых полях работает как задумано. Ex.

const userSchema = new Schema({h:{alias:"handle",type:String}});
const User = model("User",userSchema);
const user = new User({handle:"Jack"});
const query = {handle:"Jack"};
const users = await User.find(User.translateAliases(query));
console.log(users);
// prints [{...,handle:"Jack",...}]

Но для вложенных реквизитов, каждый из которых имеет псевдонимы, запрос выполняется только при использовании псевдонимов полей без псевдонимов. Ex.

const userSchema = new Schema({
    n:{alias:"name",type:{
        f:{alias:"first",type:String},
        l:{alias:"last",type:String}}}});
const User = model("User",userSchema);
const user = new User({name:{first:"Jack",last:"Swift"}});
const query1 = {"name.first":"Jack"};
const query2 = {name:{first:"Jack"}};
const query3 = {"name.f":"Jack"};
const query4 = {"n.f":"Jack"};
const users1 = await User.find(User.translateAliases(query1));
const users2 = await User.find(User.translateAliases(query2));
const users3 = await User.find(User.translateAliases(query3));
const users4 = await User.find(User.translateAliases(query4));
console.log(users1,users2,users3,users4);
// prints [],[],[],[{...name:{first:"Jack,last:"Swift"}...}]

Я также попробовал оба варианта: 1) использование полного пути в строке в объявлении схемы

alias:"name.first"

вместо "first" и 2) превращение свойства name в отдельную схему.

const nameSchema = new Schema({f:{alias:"first"...
const userSchema = new Schema({n:{alias:"name",type:nameSchema}});

Без кубиков. Я хочу верить, что команда Mongoose наверняка думала, что люди будут вкладывать псевдонимы, поэтому давайте сделаем больше, чем просто запрос на верхнем уровне, конечно, это я, лол. Может кто-нибудь бросить решение здесь, это сводит меня с ума.

1 Ответ

0 голосов
/ 31 октября 2018

В качестве обходного пути я создал объект карты запроса, который отображает мои пути с псевдонимами в точках и пути без псевдонимов.Пример.

const queryMap = {"name.first":"n.f","name.last":"n.l",...};

Это не решение, но оно работает и, как побочный эффект, позволяет отклонять запросы, которые не соответствуют карте.

...