MongoDB上嵌套字段的乘法
在MongoDB中的一个数据库中,我尝试按日期对一些数据进行分组(一年中的每一天一组),然后添加一个额外的字段,该字段是两个现有字段相乘的结果 数据结构是:MongoDB上嵌套字段的乘法,mongodb,aggregation-framework,multiplication,Mongodb,Aggregation Framework,Multiplication,在MongoDB中的一个数据库中,我尝试按日期对一些数据进行分组(一年中的每一天一组),然后添加一个额外的字段,该字段是两个现有字段相乘的结果 数据结构是: { "_id" : ObjectId("567a7c6d9da4bc18967a3947"), "units" : 3.0, "price" : 50.0, "name" : "Name goes here", "datetime" : ISODate("2015-12-23T10:50:21
{
"_id" : ObjectId("567a7c6d9da4bc18967a3947"),
"units" : 3.0,
"price" : 50.0,
"name" : "Name goes here",
"datetime" : ISODate("2015-12-23T10:50:21.560+0000")
}
我首先使用$project
尝试了两阶段方法,然后像这样使用$group
db.things.aggregate(
[
{
$project: {
"_id" : 1,
"name" : 1,
"units" : 1,
"price" : 1,
"datetime":1,
"unitsprice" : { $multiply: [ "$price", "$units" ] }
}
},
{
$group: {
"_id" : {
"day" : {
"$dayOfMonth" : "$datetime"
},
"month" : {
"$month" : "$datetime"
},
"year" : {
"$year" : "$datetime"
}
},
"things" : {
"$push" : "$$ROOT"
}
}
}
],
)
在这种情况下,第一步($project
)给出了预期的输出(预期值为unitsprice),但在执行第二步$group
时,它会输出以下错误:
“errmsg”:$multiply仅支持数字类型,不支持字符串”,
“代码”:16555
我也试着扭转局面,先做$group
步骤,然后做$project
db.things.aggregate(
[
{
$group: {
"_id" : {
"day" : {
"$dayOfMonth" : "$datetime"
},
"month" : {
"$month" : "$datetime"
},
"year" : {
"$year" : "$datetime"
}
},
"things" : {
"$push" : "$$ROOT"
}
}
},
{
$project: {
"_id" : 1,
"things":{
"name" : 1,
"units" : 1,
"price" : 1,
"datetime":1,
"unitsprice" : { $multiply: [ "$price", "$units" ] }
}
}
}
],
);
但是在这种情况下,乘法的结果是:unitsprice:null
有什么方法可以实现这个乘法吗?另外,最好是输出没有嵌套字段,所以看起来像:
{"_id":
"units":
"price":
"name":
"datetime":
"unitsprice":
}
提前谢谢
PS:我正在运行MongoDB 3.2最终发现了错误。导入其中一个字段时,一些
price
字段被创建为string
。令人惊讶的是,在项目的步骤中首次执行乘法时,错误没有出现(输出正常,直到到达第一个错误的字段,然后停止),但在执行组
步骤时。
为了查找文本字段,我使用了以下查询:
find({price:{$type:2}})
感谢提示终于找到了错误。导入其中一个字段时,一些价格
字段被创建为字符串
。令人惊讶的是,在项目
步骤中首次执行乘法时,错误没有出现(输出正常,直到到达第一个错误的字段,然后停止),但在执行组
步骤时。
为了查找文本字段,我使用了以下查询:
find({price:{$type:2}})
感谢您的提示查询对我有效。是否可能在集合中的某个位置有类型错误的价格或单位字段?您可以使用以下查询进行检查:db.things.find({$or:[{$price:{$not:{$type:1}}},{$units:{$not:{$type:1}}}})是的,我有Double和Int32两个字段。我应该把所有字段都改成Double吗?有什么办法吗?谢谢!Double和Int32应该很好用。我认为你不需要把所有字段都改成Double。我已经检查过了,所有的单位和价格字段都是Int32或Double,所以问题似乎不存在,但无论如何,谢谢。还有通过第一种方法(先是$project,然后是$group)考虑到这一点,乘法确实给出了预期的输出,只有在$group步骤之后,我才得到错误消息这是您的真实数据结构吗?查询对我有效。是否可能集合中的某个地方有错误类型的price或unit字段?您可以使用这样的查询进行检查:db.things.find({$or:[{price:{$not:{$type:1}},{units:{$not:{$type:1}}]}是的,我有Double和Int32两个字段。我应该把所有字段都改成Double吗?有什么办法吗?谢谢!Double和Int32应该很好用。我认为你不需要把所有字段都改成Double。我已经检查过了,所有的单位和价格字段都是Int32或Double,所以问题似乎不存在,但无论如何,谢谢。还有考虑到通过执行第一种方法(首先是$project,然后是$group),乘法确实给出了预期的输出,只有在$group步骤之后,我才得到错误消息这是您的真实数据结构吗?