用猫鼬查询嵌套别名

时间:2018-10-27 19:14:26

标签: mongoose aliases

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

但是,对于嵌套道具,每个道具都有别名,仅在使用非别名字段名时才执行查询。 例如。

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 :(得分:0)

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

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

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

相关问题