首页 > 解决方案 > 使用 Mongoose 查询嵌套别名

问题描述

Mongoose 5.3.3 - 在简单字段上查询别名按预期工作。前任。

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",...}]

但是,对于嵌套的 props,每个都有别名,查询仅在使用非别名字段名时执行。前任。

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"

而不仅仅是“第一个”,并且 2)使 name 属性成为一个单独的模式。

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

没有骰子。我想相信 Mongoose 团队肯定认为人们会嵌套别名,所以让我们做的不仅仅是顶级可查询,当然是我哈哈。任何人都可以在这里放弃解决方案,这让我发疯。

标签: mongoosealiases

解决方案


作为一种解决方法,我创建了一个查询映射对象,它将我的别名点路径映射到非别名点路径。前任。

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

这不是解决方案,但它有效并且作为副作用,允许拒绝不适合地图的查询。


推荐阅读