[英]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;
這是一個字符串,我試圖在此對象上添加name
的sortOrder
屬性並將其設置為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.