簡體   English   中英

JavaScript:為MongoDB開發搜索查詢

[英]JavaScript: Developing a search query for MongoDB

我需要一些協助來開發搜索查詢,以便為Electron應用程序中的按鈕提供一些功能。

這是我走了多遠:

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但在任何給定時間只能指定一個。

我希望能夠根據用戶選擇的內容傳遞不同的sortProperty 我想擁有一個與sortProperty的鍵。

因此,如果sortProperty等於age,我需要確保我有一條聲明age。

看來您已經具有執行查詢所需的所有部分。 您只需要基於sortProperty創建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); 

所以以上答案是最好的解決方案,因為它是ES6,並且更優雅。 我想分享在獲得答案並進行更深入研究后所學的ES5老式方法。

通過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);
};

我將其制成一個空對象,然后查看它並添加等於1 sortProperty如下所示:

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。

方括號表示查看sortProperty變量:

sortOrder[sortProperty] = 1;

這是一個字符串,我試圖在此對象上添加namesortOrder屬性並將其設置為1 ,因此,如果您在Chrome控制台或代碼段中運行此命令,最終結果為{ name: 1 }

對我來說,學習曲線以及所選答案可以幫助我學習的是ES6內插屬性或鍵。 這東西:

.sort({ [sortProperty]: 1 })

這里發生的是在運行時查看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
  Artist.find()
    .sort({ [sortProperty]: 1 })
    .skip(offset)
    .limit(limit);
};

我只是分享在學習和實施過程中所學到的知識。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM