$elemMatch dosen';MongoDB聚合框架中$unwind后无法工作
我收集了以下数据:$elemMatch dosen';MongoDB聚合框架中$unwind后无法工作,mongodb,aggregation-framework,mongo-java,Mongodb,Aggregation Framework,Mongo Java,我收集了以下数据: { “_id”:ObjectId(“51f1fcc08188d3117c6da351”), “客户id”:“abc123”, “订单日期”:ISODate(“2012-10-03T18:30:00Z”), “状态”:“A”, “价格”:25, “项目”:[{ “sku”:“ggg”, “数量”:7, “价格”:2.5 }, { “sku”:“ppp”, “数量”:5, “价格”:2.5 }] } 我正在使用以下查询: cmd{“聚合”:“订单”,“管道”:[ {“$unwi
{
“_id”:ObjectId(“51f1fcc08188d3117c6da351”),
“客户id”:“abc123”,
“订单日期”:ISODate(“2012-10-03T18:30:00Z”),
“状态”:“A”,
“价格”:25,
“项目”:[{
“sku”:“ggg”,
“数量”:7,
“价格”:2.5
}, {
“sku”:“ppp”,
“数量”:5,
“价格”:2.5
}]
}
我正在使用以下查询:
cmd{“聚合”:“订单”,“管道”:[
{“$unwind”:“$items”},
{“$match”:{“items”:{“$elemMatch”:{“qty”:{“$in”:[7]}},
{“$group”:{“price”:{“$first”:“$price”},“items”:{“$push”:{“sku”:“$items.sku”}},{“items”:“$items”}},{,
{“$sort”:{“price”:-1},
{“$project”:{“_id”:0,“价格”:1,“项目”:1}
]}
无法理解哪里出了问题这是因为您在
$unwind
之后执行了$match
$unwind
生成一个新的文档流,其中项不再是数组()
它发送每个文档的次数与文档中的项目数量相同
如果要选择包含所需元素的文档,然后处理其所有文档,应首先调用$match
:
db.orders.aggregate(
{ "$match" : { "items" : { "$elemMatch" : { "qty" : { "$in" : [ 7]}}}}},
{ "$unwind" : "$items"},
...
);
如果要在$unwind
之后选择要处理的项目,应删除$elemMatch
:
db.orders.aggregate(
{ "$unwind" : "$items"},
{ "$match" : { "items.qty" : { "$in" : [7]}}},
...
);
在第一种情况下,您将获得两个文档:
{
"price" : 25,
"items" : [
{"sku" : "ppp"}
]
},
{
"price" : 25,
"items" : [
{"sku" : "ggg"}
]
}
在第二种情况下,您将得到一个:
{
"price" : 25,
"items" : [
{"sku" : "ggg"}
]
}
更新。$unwind
之后,您的文档将如下所示:
{
"_id" : ObjectId("51f1fcc08188d3117c6da351"),
"cust_id" : "abc123",
"ord_date" : ISODate("2012-10-03T18:30:00Z"),
"status" : "A",
"price" : 25,
"items" : {
"sku" : "ggg",
"qty" : 7,
"price" : 2.5
}
}
对于少量文档,可以展开并匹配。但是,如果文档数量很大,最好进行匹配($elemMatch),展开,然后再次匹配
db.orders.aggregate(
{ "$match" : { "items" : { "$elemMatch" : { "qty" : { "$in" : [ 7]}}}}},
{ "$unwind" : "$items"},
{ "$match" : { "items.qty" : { "$in" : [7]}}}
...
...
);
第一个匹配项将仅筛选符合数量标准的文档。在所选文档中,第二个匹配项将删除与数量标准不匹配的子文档。如果您可以格式化您的问题,这会让您感到有点烦人you@Sammaye下次我会处理好的。你只试过火柴吗?也许您的问题在于另一个参数。Items不再是数组,但点表示法在展开后仍然有效?如果点符号有效,那么您如何解释elemMatch无效,您的答案有点含糊不清,$unwind
项目将成为单个文档。点表示法既适用于嵌套对象,也适用于数组。但数量在展开后位于根文档中,它不是嵌套的否,它不是。试试db.orders.aggregate({“$unwind”:“$items”})
看看它是什么样子。好吧,很公平,这就是总数