【问题标题】:How to dynamically nest $or operator into $and Mongoose statement?如何将 $or 运算符动态嵌套到 $and Mongoose 语句中?
【发布时间】:2022-01-03 05:22:52
【问题描述】:

假设我在电影数据库中有 3 个 MongDB 条目:

"books": [
  {
    "_id": "xxxxxx",
    "title": "Fast Five",
    "rating": 6
  },
  {
    "_id": "yyyyyy",
    "title": "Kill Bill",
    "rating": 8
  },
  {
    "_id": "zzzzzzzz",
    "title": "Jumanji",
    "rating": 5
  }
]

如果标题和评分符合条件,我会使用 GraphQL 检索多部电影的 id:

query{
   getMovies(itemFilterInput: {titles:["Fast Five", "Jumanji"], rating:6}){
    _id
   title
  }
}

这应该返回快五。 我希望将其转换为这样的 mongoDB 查询:

{$and: [{rating:6}, {$or: [{title:"Fast Five", title:"Jumanji"}]}]}

在后端,我使用 NodeJS 和 Mongoose 来处理这个查询,我使用这样的东西:

 getMovies: async args => {
try{
  let d = args.itemFilterInput;
  let filters = new Array();

  const keys = Object.keys(d);
  keys.forEach((key) => {
      // The titles case
      if(d[key] instanceof Array){
        var sObj = {};
        var sObjArray = [];
        d[key].map(prop => {
          sObj[key] = prop;
          sObjArray.push(sObj);
        });
        filters.push({$or: sObjArray});
      }else{
        // The rating case
        var obj = {};
        obj[key] = d[key];
        filters.push(obj);
      }
  });

  const items = await Item.find({$and: filters});
  return items.map(item => {
    return item;
  });
} catch (err) {
  throw err;
}

}

很遗憾,这种方法行不通。 将 $or 参数嵌套在 $and params 中的正确方法是什么?

【问题讨论】:

  • this query 你在找什么?
  • 成功了,谢谢!如果我只是将 $or 查询写出来,它也可以正常工作,但是我在创建对象的某个地方搞砸了。您的解决方案更加简洁明了。

标签: javascript node.js json mongodb mongoose


【解决方案1】:

答案:

首先,最好使用 $in 运算符而不是 $and/$or 组合。

并解决错误:在任何地方使用引号来声明查询。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多