Node.js 在mongodb中撤消聚合解卷

Node.js 在mongodb中撤消聚合解卷,node.js,mongodb,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongodb Query,Aggregation Framework,我有多个类似这样的数据 { "_id" : ObjectId("57189fcd72b6e0480ed7a0a9"), "venueId" : ObjectId("56ce9ead08daba400d14edc9"), "companyId" : ObjectId("56e7d62ecc0b8fc812b2aac5"), "cardTypeId" : ObjectId("56cea8acd82cd11004ee67a9"), "matchData" : [

我有多个类似这样的数据

{
    "_id" : ObjectId("57189fcd72b6e0480ed7a0a9"),
    "venueId" : ObjectId("56ce9ead08daba400d14edc9"),
    "companyId" : ObjectId("56e7d62ecc0b8fc812b2aac5"),
    "cardTypeId" : ObjectId("56cea8acd82cd11004ee67a9"),
    "matchData" : [ 
        {
            "matchId" : ObjectId("57175c25561d87001e666d12"),
            "matchDate" : ISODate("2016-04-08T18:30:00.000Z"),
            "matchTime" : "20:00:00",
            "_id" : ObjectId("57189fcd72b6e0480ed7a0ab"),
            "active" : 3,
            "cancelled" : 0,
            "produced" : 3
        }, 
        {
            "matchId" : ObjectId("57175c25561d87001e666d13"),
            "matchDate" : ISODate("2016-04-09T18:30:00.000Z"),
            "matchTime" : "20:00:00",
            "_id" : ObjectId("57189fcd72b6e0480ed7a0aa"),
            "active" : null,
            "cancelled" : null,
            "produced" : null
        }
    ],
    "__v" : 0
}
db.getCollection('matchWiseData').aggregate([
{"$match":{
   "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
}},
{"$unwind":"$matchData"},
{"$match":{
    "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}}
}])
我正在按companyId进行分组,它的工作很好,但我想基于matchtime和matchId在matchData中搜索。为此,我在解绑后释放$unwind matchData,我使用我的搜索查询如下

{
    "_id" : ObjectId("57189fcd72b6e0480ed7a0a9"),
    "venueId" : ObjectId("56ce9ead08daba400d14edc9"),
    "companyId" : ObjectId("56e7d62ecc0b8fc812b2aac5"),
    "cardTypeId" : ObjectId("56cea8acd82cd11004ee67a9"),
    "matchData" : [ 
        {
            "matchId" : ObjectId("57175c25561d87001e666d12"),
            "matchDate" : ISODate("2016-04-08T18:30:00.000Z"),
            "matchTime" : "20:00:00",
            "_id" : ObjectId("57189fcd72b6e0480ed7a0ab"),
            "active" : 3,
            "cancelled" : 0,
            "produced" : 3
        }, 
        {
            "matchId" : ObjectId("57175c25561d87001e666d13"),
            "matchDate" : ISODate("2016-04-09T18:30:00.000Z"),
            "matchTime" : "20:00:00",
            "_id" : ObjectId("57189fcd72b6e0480ed7a0aa"),
            "active" : null,
            "cancelled" : null,
            "produced" : null
        }
    ],
    "__v" : 0
}
db.getCollection('matchWiseData').aggregate([
{"$match":{
   "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
}},
{"$unwind":"$matchData"},
{"$match":{
    "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}}
}])

它给了我正确的结果,但在应用“展开”之后,是否有任何方法可以撤消它?我正在使用“展开”来搜索子文档内部,或者有任何其他方法来搜索子文档内部

当然,您可以使用和将文档恢复到原来的状态:

db.getCollection'matchWiseData'。聚合[ {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$unwind:$matchData}, {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$group:{ _id:$\u id, venueId:{$first:$venueId}, companyId:{$first:$companyId}, cardTypeId:{$first:$cardTypeId}, matchData:{$push:$matchData} }} ] 但您可能首先应该使用MongoDB 3.2:

db.getCollection'matchWiseData'。聚合[ {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$项目:{ 韦纽伊德:1, 公司名称:1,, cardTypeId:1, 匹配数据:{ $filter:{ 输入:$matchData, as:比赛, 条件:{ $or:[ {$eq:[$$match.matchId,ObjectId57175c25561d87001e666d12]} ] } } } }} ] 如果您至少有MongoDB 2.6,您仍然可以使用:

db.getCollection'matchWiseData'。聚合[ {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$项目:{ 韦纽伊德:1, 公司名称:1,, cardTypeId:1, 匹配数据:{ $setDifference:[ {$map:{ 输入:$matchData, as:比赛, 在:{ $cond:[ {$or:[ {$eq:[$$match.matchId,ObjectId57175c25561d87001e666d12]} ]}, $$匹配, 错误的 ] } }}, [错误] ] } }} ] 当每个数组元素都有一个唯一的标识符时,这就很好了,因此set操作只是从$map中删除假值

这两种方法都提供了一种从数组中过滤内容的方法,而无需实际使用

注意:不确定您是否真正掌握了用于匹配条件列表而不是要求在数组上匹配的方法。因此,一般情况下,条件可以是:

matchData.matchId:Objectd57175C25561D87001E666D12
实际上只有一个值可以匹配。当您有条件列表时,可以使用$in和$or。数组本身对所需的操作员没有影响。

当然,您可以使用和将文档恢复到原来的状态:

db.getCollection'matchWiseData'。聚合[ {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$unwind:$matchData}, {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$group:{ _id:$\u id, venueId:{$first:$venueId}, companyId:{$first:$companyId}, cardTypeId:{$first:$cardTypeId}, matchData:{$push:$matchData} }} ] 但您可能首先应该使用MongoDB 3.2:

db.getCollection'matchWiseData'。聚合[ {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$项目:{ 韦纽伊德:1, 公司名称:1,, cardTypeId:1, 匹配数据:{ $filter:{ 输入:$matchData, as:比赛, 条件:{ $or:[ {$eq:[$$match.matchId,ObjectId57175c25561d87001e666d12]} ] } } } }} ] 如果您至少有MongoDB 2.6,您仍然可以使用:

db.getCollection'matchWiseData'。聚合[ {$match:{ matchData.matchId:{$in:[ObjectId57175c25561d87001e666d12]} }}, {$项目:{ 韦纽伊德:1, 公司名称:1,, cardTypeId:1, 匹配数据:{ $setDifference:[ {$map:{ 输入:$matchData, as:比赛, 在:{ $cond:[ {$or:[ {$eq:[$$match.matchId,ObjectId57175c25561d87001e666d12]} ]}, $$匹配, 错误的 ] } }}, [错误] ] } }} ] 当每个数组元素都有一个唯一的标识符时,这就很好了,因此set操作只是从$map中删除假值

这两种方法都提供了一种从数组中过滤内容的方法,而无需实际使用

注意:不确定您是否真正掌握了用于匹配条件列表而不是要求在数组上匹配的方法。因此,一般情况下,条件可以是:

matchData.matchId:Objectd57175C25561D87001E666D12 实际上只有一个值可以匹配。当您有条件列表时,可以使用$in和$or。数组本身对所需的运算符没有影响