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
阶段,我想用多少就用多少,对吧?是的,实际上是任何阶段。只要有意义。