社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

JavaScript:为MongoDB开发搜索查询

Daniel • 5 年前 • 1485 次点击  

我需要一些帮助来开发一个搜索查询,以便在我的电子应用程序中提供一个按钮一些功能。

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  Artist.sort()
    .find()
    .offset()
    .limit();
};

我跳过了 criteria 现在请不要理会。用户应该能够按艺术家姓名、年龄和发行的专辑进行排序。这个 sortProperty 1 .

排序背后的真正挑战是我需要指定不同的 sortProperties 但在任何时候都只有一个。

我想通过一个不同的 排序属性 排序属性 是。

所以如果 排序属性 等于年龄,我需要确保我有一个声明说年龄。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53623
 
1485 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Daniel
Reply   •   1 楼
Daniel    6 年前

所以以上的答案是最好的解决方案,因为它是ES6和更优雅。我想和大家分享我在得到这个答案后学到的ES5老校风,并对它进行更深入的研究。

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  const sortOrder = {};

  Artist.find({})
    .sort()
    .skip(offset)
    .limit(limit);
};

我把它变成了一个空的物体,然后看着它并添加 sortProperty 等于 1 就像这样:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  const sortOrder = {};
  sortOrder[sortProperty] = 1;

  Artist.find({})
    .sort()
    .skip(offset)
    .limit(limit);
};

sortOrder 就像这样:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  const sortOrder = {};
  sortOrder[sortProperty] = 1;

  Artist.find({})
    .sort(sortOrder)
    .skip(offset)
    .limit(limit);
};

好吧,这就是ES5方法,如果有人对它感兴趣的话,但是正如你在上面看到的,ES6解决方案看起来更好。

创建一个对象并同时向其添加一个属性的整个问题是,它在ES5中不受支持,我们必须首先声明一个对象,然后向其添加一个属性并将该属性设置为1。

方括号表示 变量:

sortOrder[sortProperty] = 1;

这是一个字符串,我试图添加 财产 name 设置为 因此,如果在Chrome控制台或代码片段中运行此命令,最终结果是 { name: 1 } .

.sort({ [sortProperty]: 1 })

这里发生的是在运行时查看 排序属性 变量及其等于的值,将该属性添加到此对象,并将其值设置为 1个 .

所以说得很清楚,是的,最初给出的答案是我采用的优雅的解决方案:

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  // write a query that will follow sort, offset, limit options only
  // do not worry about criteria yet
  Artist.find()
    .sort({ [sortProperty]: 1 })
    .skip(offset)
    .limit(limit);
};

我只是分享我在学习和实施过程中学到的东西。

molamk
Reply   •   2 楼
molamk    6 年前

似乎已经有了执行查询所需的所有部分。你只需要创建 sort 基于您的 sortProperty 排序属性 例如 age

module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
  return Artist
    .find()
    .sort({ [sortProperty]: 1 })
    .skip(offset)
    .limit(limit);
};

注意

为了演示动态密钥分配,这里有一个片段

const sortProperty = 'age';
const selector = { [sortProperty]: 1 };

console.log(selector);