Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Node.js 带条件和展开的MongoDB聚合(一个查询而不是多个查询)_Node.js_Mongodb_Mongoose_Aggregation Framework_Aggregate - Fatal编程技术网

Node.js 带条件和展开的MongoDB聚合(一个查询而不是多个查询)

Node.js 带条件和展开的MongoDB聚合(一个查询而不是多个查询),node.js,mongodb,mongoose,aggregation-framework,aggregate,Node.js,Mongodb,Mongoose,Aggregation Framework,Aggregate,我想了解它是如何工作的: 我收集了如下数据: { _id: 5a854ee830093123a44bb7ec, item: 124103, owner: 'ZZZ', quantity: 50, //between 1 and X (X is fixed and I determine it before, in this case it's 50) lastModified: 1518685663000, //there are various lastMo

我想了解它是如何工作的:

我收集了如下数据:

  { _id: 5a854ee830093123a44bb7ec,
    item: 124103,
    owner: 'ZZZ',
    quantity: 50, //between 1 and X (X is fixed and I determine it before, in this case it's 50)
    lastModified: 1518685663000, //there are various lastModified intraday
    price: 116000,
    date: 2018-02-15 17:28:04.332 //default: new Date().toISOString()
  }
和聚合脚本:

    x.aggregate([
        {
            $project: { year: { $year: "$date" },
                month: { $month: "$date" },
                day: { $dayOfMonth: "$date" },
                item: "$item",
                owner: "$owner",
                quantity: "$quantity",
                lastModified: "$lastModified",
                price: "$price"}
        },
        {
            $match: { item: 124103, day: 15, month: 2, year: 2018, lastModified: 1518685663000}
        },
        //and here I use my group stage
        {
            $group:
               {
                   _id: "$item",
                   min_1: { $cond: { if: { $eq: [ "$quantity", 1] }, then: { $min: "$price" } } },
                   min_X: { $cond: { if: { $eq: [ "$quantity", X(50)] }, then: { $min: "$price" } } },
                 // then same for $max and $avg, (with different quantities) etc
                },
        },callback
我想要的是:

min_X
字段中,只有当
quantity
等于X值(50)时,我才希望收到
$min:$price

事实上,我可以通过许多查询收到必要的数据(我现在确实这样做了),但我想StackOverflow社区的人知道如何通过使用$match和$unwind的一个查询来实现相同的结果


是的,我已经阅读了文档,但只理解我应该向您的
$cond
操作员报告。我想有人可以把我带到这里,并提供相关的例子。例如,将来我希望在日内使用不同的
$lastmedited
进行操作,这意味着我希望在
$project
阶段之后对数据进行$group,然后松开光标,并将其与另一个
$lastmedited
进行$group

反过来是
$min
,然后是
$cond

需要一个用于分组的字段。在您的情况下,它是
$min
。然后可以应用条件
$cond
,该条件用于聚合。在
$min
的情况下,您可以对不符合条件的文档使用
Number.MAX\u值。它总是大于或等于javascript中的任何其他值。你可以在这里自由使用任何合理的常数

之后,您可能需要在另一个投影阶段将垃圾号替换为空值来清除垃圾号:

x.aggregate([
    .....
    { $group: {
        _id: "$item",                   
        min_1: { $min: { $cond: [ { $eq: [ "$quantity", 1] }, "$price", Number.MAX_VALUE ] } },
        min_50: { $min: { $cond: [ { $eq: [ "$quantity", 50] }, "$price", Number.MAX_VALUE ] } }
        // then same for $max and $avg, (with different quantities) etc
    } },
    { $project: {
        min_1: { $cond: [ { $eq: [ "$min_1", Number.MAX_VALUE] }, null, "$min_1" ] },
        min_50: { $cond: [ { $eq: [ "$min_50", Number.MAX_VALUE] }, null, "$min_50" ] }
    } }
])

至于现在,实际上问题是在
$match
阶段,我可以在那里指出我想要的一切,例如
$match:{item:124103,day:15,month:2,year:2018,lastModified:1518685663000,quantity:200}
阶段,然后在
$group
阶段计算min/max/avg/无论什么,问题是如何为
$match:{item:124103,day:15,month:2,year:2018,lastModified:1518685663000,quantity:1}
展开/更改此
$match
并将所有数据保存(或导出)在一个变量中。目前,问题是
$project:{year:{$year:{$year:$date},
导致提供的文档出现错误,因为那里没有
日期
字段。作为旁注,建议更新问题本身,而不是对其进行评论。
$project
完全没有问题,实际脚本工作正常。问题在于:如何在一个查询中接收必要的数据(而不是很多)你应该提供一个例子。你提供的例子在项目阶段失败了。哦,是的,很抱歉忘了在项目阶段之前复制粘贴它,//修复顺便说一句,如果我理解正确,我可以使用
$project
阶段,我想用多少就用多少,对吧?是的,实际上是任何阶段。只要有意义。