MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Undo Unwind in aggregate в mongodb

Разбира се, можете просто да използвате $push и $first в $group за да върнете документа към това, което беше:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$unwind":"$matchData"},
    { "$match":{
        "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$group": {
        "_id": "$_id",
        "venueId": { "$first": "$venueId" },
        "companyId": { "$first": "$companyId" },
        "cardTypeId": { "$first": "$cardTypeId" },
        "matchData": { "$push": "$matchData" }
    }}
])

Но вероятно просто трябваше да използвате $filter с MongoDB 3.2 на първо място:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$project": {
        "venueId": 1,
        "companyId": 1,
        "cardTypeId": 1,
        "matchData": { 
            "$filter": {
                "input": "$matchData",
                "as": "match",
                "cond": {
                   "$or": [
                       { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                   ]
                }
            }
        }
    }}
])

И ако имахте поне MongoDB 2.6, все още можехте да използвате $map и $setDifference вместо това:

db.getCollection('matchWiseData').aggregate([
    { "$match":{
       "matchData.matchId":{"$in":[ObjectId("57175c25561d87001e666d12")]}
    }},
    { "$project": {
        "venueId": 1,
        "companyId": 1,
        "cardTypeId": 1,
        "matchData": { 
            "$setDifference": [
                { "$map": {
                    "input": "$matchData",
                    "as": "match",
                    "in": {
                        "$cond": [
                           { "$or": [
                              { "$eq": [ "$$match.matchId", ObjectId("57175c25561d87001e666d12") ] }
                           ]},
                            "$$match",
                            false
                        ]
                    }
                }},
                [false]
            ]
        }
    }}
])

Това е напълно добре, когато всеки елемент от масива вече има "уникален" идентификатор, така че операцията "set" просто премахва false стойности от $map .

И двата начина за „филтриране“ на съдържание от масив, без всъщност да използвате $unwind

N.B :Не съм сигурен дали наистина разбирате това $in се използва за съпоставяне на "списък с условия" вместо да се изисква съвпадение на масиви. Така че най-общо условието може да бъде просто:

 "matchData.matchId": ObjectId("57175c25561d87001e666d12")

Където всъщност имате само една стойност, с която да съпоставите. Използвате $in и $or когато имате "списък" с условия. Самите масиви нямат значение за необходимия оператор.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB текстов индексиращ масив обекти колони

  2. MongoDB $dateFromString

  3. Качване и изтегляне на файлове с помощта на meteor

  4. Вмъкване на Date() в Mongodb чрез mongo shell

  5. Как да използвате криптиране за защита на данните на MongoDB