Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何加权文档以创建排序标准?_Javascript_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 如何加权文档以创建排序标准?

Javascript 如何加权文档以创建排序标准?,javascript,mongodb,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试聚合一个集合,其中包含如下所示的文档: [ { "title" : 1984, "tags" : ['dystopia', apocalypse', 'future',....] }, .... ] db.books.aggregate( { $group : { _id : {title:"$title"} , convenience: { $sum: { $cond: [ {tags: {$in: keywords}}, 1, 0 ] } }

我正在尝试聚合一个集合,其中包含如下所示的文档:

[
  {  
    "title" : 1984,
    "tags" : ['dystopia', apocalypse', 'future',....]
  },
  ....
]
db.books.aggregate(
   { $group : { _id : {title:"$title"} , convenience: { $sum: { $cond: [ {tags: {$in: keywords}}, 1, 0 ] } } } },
            { $sort : {'convenience': -1}})
我有一个关键字的标准数组,例如:

var keywords = ['future', 'google', 'cat',....]
我想要实现的是聚合集合,以便根据“便利性”标准对其进行$group,以便按照在其标记字段中包含更多关键字的文档对文档进行排序

这意味着,如果一个文档的标签中包含“future”、“google”、“cat”,那么它将被排序在另一个包含“future”、“cat”、“apple”的文档之前

到目前为止,我已经尝试过这样的方法:

[
  {  
    "title" : 1984,
    "tags" : ['dystopia', apocalypse', 'future',....]
  },
  ....
]
db.books.aggregate(
   { $group : { _id : {title:"$title"} , convenience: { $sum: { $cond: [ {tags: {$in: keywords}}, 1, 0 ] } } } },
            { $sort : {'convenience': -1}})

但是
$in
运算符不是布尔值,因此不起作用。我环顾四周,没有找到任何运算符可以帮助我解决这个问题。

正如您所说,您需要一个逻辑运算符来进行计算。这有点简洁,但下面是一个使用以下内容的实现:

我将把实现的其余部分留给您来完成,但这应该显示基本的构造,直到您想要进行的匹配为止

附加 从您的评论来看,似乎还有一个您正在努力解决的编程问题,与您如何执行这样的聚合有关,其中您有一个数组,以您上面给出的形式进行查询:

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);
});
然后使用
或condition
变量定义聚合查询:

db.books.aggregate([
    {$unwind: "$tags" },
    {$group: {
        _id: "$title",
        weight: {
            $sum: {$cond: [
               {$or: orCondition }
            1, 0 ]}
        }
    }}
])

或者,你需要构建的任何部分。这通常是在现实世界中完成的,在现实世界中,我们几乎不会硬编码这样的数据结构。

谢谢Neil。有点奏效了。实际上,我的问题是数组关键字来自一个输入字段,那么长度和内容既不确定也不稳定。我需要一个解决方案,$unwind同时起作用…@user2988332我在你的问题中看到,你正在定义一个变量,并将其传递到聚合阶段。在现实世界中,我们几乎不会硬编码如图所示的结构,而是从我们拥有的数据生成它。这意味着您可以在每个查询中动态地在$or条件中创建结构。@user2988332我认为带有附加信息的编辑可能会清除您似乎在寻找的内容。它工作得很好。我现在把你的答案和这个混合在一起,我认为根据你所说的,我的推理不符合现实世界的方向。我实际上要做的是根据用户输入的关键字数组对数据库中记录的书籍列表进行排序。根据标签的便利性计算便利性。有更好的办法吗?@user2988332呵呵!这可能是另一个问题。因此,在这种情况下,请随意询问社区。