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
$elemMatch dosen';MongoDB聚合框架中$unwind后无法工作_Mongodb_Aggregation Framework_Mongo Java - Fatal编程技术网

$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”})
看看它是什么样子。好吧,很公平,这就是总数