[英]How to weight documents to create sort criteria?
我正在嘗試匯總其中包含如下文檔的集合:
[
{
"title" : 1984,
"tags" : ['dystopia', apocalypse', 'future',....]
},
....
]
我有一個關鍵字的條件數組,例如:
var keywords = ['future', 'google', 'cat',....]
我想要實現的是匯總集合,以便根據“便利”條件對集合進行$ group,以便按照在其標簽字段中包含更多關鍵字的文檔對文檔進行排序。
這意味着,如果一個文檔的標記中包含“ future”,“ google”,“ cat”,則該文檔將排在另一個具有“ future”,“ cat”,“ apple”的文檔之前。
到目前為止,我已經嘗試過這樣的事情:
db.books.aggregate(
{ $group : { _id : {title:"$title"} , convenience: { $sum: { $cond: [ {tags: {$in: keywords}}, 1, 0 ] } } } },
{ $sort : {'convenience': -1}})
但是$in
運算符不是布爾值,因此它不起作用。 我環顧四周,沒有找到任何可以幫助我解決這個問題的操作員。
如您所說,您需要邏輯運算符才能評估$ cond 。 有點簡潔,但這是一個使用$ or的實現:
db.books.aggregate([
{$unwind: "$tags" },
{$group: {
_id: "$title",
weight: {
$sum: {$cond: [
// Test *equality* of the `tags` value against any of the list
{$or: [
{$eq: ["$tags", "future"]},
{$eq: ["$tags", "google"]},
{$eq: ["$tags", "cat"]},
]},
1, 0 ]}
}
}}
])
我將剩下的實現留給您,但這應該顯示基本結構,直到您想要進行匹配為止。
從您的意見也有似乎是你正在掙扎編程的問題,那就是你有項目的數組在你上面給的形式來查詢您如何執行這樣的聚集涉及:
var keywords = ['future', 'google', 'cat',....]
由於無法在管道條件中直接使用此結構,因此您需要做的就是將其轉換為所需的內容。 每種語言都有其自己的方法,但是在JavaScript版本中:
var keywords = ['future', 'google', 'cat'];
var orCondition = [];
keywords.forEach(function(value) {
var doc = {$eq: [ "$tags", value ]};
orCondition.push(doc);
});
然后只需使用orCondition
變量定義聚合查詢:
db.books.aggregate([
{$unwind: "$tags" },
{$group: {
_id: "$title",
weight: {
$sum: {$cond: [
{$or: orCondition }
1, 0 ]}
}
}}
])
或就此而言,您需要構建的任何部分。 通常這是在現實世界中完成的,我們幾乎永遠不會像這樣對數據結構進行硬編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.