2016-12-06 4 views
1

У меня есть этот документНесколько фильтров в MongoDB запросе

{ 
    "_id" : ObjectId("6afda532e9a0e3838537c71a"), 
    "VersionId" : 0, 
    "NodeId" : [ 
     { 
      "NodeId" : 0, 
      "Host" : "127.0.0.1", 
      "DatabaseName" : "NodeId0", 
      "Collection" : [ 
       { 
        "CollectionId" : 0, 
        "CollectionName" : "Codice0" 
       }, 
       { 
        "CollectionId" : 1, 
        "CollectionName" : "Codice1" 
       } 
      ] 
     }, 
     { 
      "NodeId" : 1, 
      "Host" : "127.0.0.2", 
      "DatabaseName" : "NodeId1", 
      "Collection" : [ 
       { 
        "CollectionId" : 1, 
        "CollectionName" : "Codice1" 
       } 
      ] 
     } 
    ] 
} 

и хотел бы извлечь только один поданной nodeId и 1 поле для CollectionId, возможно ли это?

Возвращенный документ должен иметь такую ​​структуру:

{ 
    VersionId: 0, 
    NodeId: { 
     NodeId: 0, 
     Collection: { 
      CollectionId: 0, 
      CollectionName: Codice0 
     } 
    } 
} 

Я попробовал этот запрос, без результата:

let queryDatabasePath = collezioneDbPath.aggregate([ 
    { $match: { "VersionId" : versionId } }, 
    { $project: { 
     NodeId : { $filter: { 
      input: '$NodeId', 
      as: 'prova', 
      cond: {$and: [ 
       {$eq: ['$$prova.NodeId' , nodeId ]}, 
       {$filter: { 
        input:'$prova', 
        as: 'prova1', 
        cond: {$eq: ['$$prova1.Collection.CollectionId', collectionId]} 
       }} 

      ]} 

     } }, 
     //"NodeId.Collection.CollectionId" : 1, 
     _id: 0 
    } } 
], function (err, res) { 
    console.log(res); 
}); 

ответ

2

Если вы с «VERSIONID» или с _ID, то результат соответствующий, как следующими способами :

db.getCollection('a').aggregate([ 
{$unwind: '$NodeId'}, 
{$unwind: '$NodeId.Collection'}, 
{$match: {"_id" : ObjectId("5846b47c8254f4cad9acadce"), "VersionId" : 0, "NodeId.NodeId": 0, "NodeId.Collection.CollectionId": 0}} 
]) 

Выход как ниже данных:

{ 
    "_id" : ObjectId("5846b47c8254f4cad9acadce"), 
    "VersionId" : 0, 
    "NodeId" : { 
     "NodeId" : 0, 
     "Host" : "127.0.0.1", 
     "DatabaseName" : "NodeId0", 
     "Collection" : { 
      "CollectionId" : 0, 
      "CollectionName" : "Codice0" 
     } 
    } 
} 
+0

Благодарим за быстрый ответ, решена проблема! : D –

2

Вы можете попробовать что-то вроде ниже. Сделать использование $map проецировать необходимые поля и использовать $filter для фильтрации соответствия узлов и коллекции и $arrayElemAt изменить массив объекта в соответствии с ожидаемой выходной формат.

aggregate([{ 
    $match: { 
     "VersionId": 0 
    } 
}, { 
    $project: { 
     NodeId: { 
      $arrayElemAt: [{ 
       $map: { 
        input: { 
         $filter: { 
          input: "$NodeId", 
          as: "prova", 
          cond: { 
           $eq: ["$$prova.NodeId", 0] 
          } 
         } 
        }, 
        as: "nd", 
        in: { 
         "NodeId": "$$nd.NodeId", 
         "Collection": { 
          $arrayElemAt: [{ 
           $filter: { 
            input: "$$nd.Collection", 
            as: "proval", 
            cond: { 
             $eq: ["$$proval.CollectionId", 0] 
            } 
           } 
          }, 0] 
         } 
        } 
       } 
      }, 0] 
     }, 
     _id: 0 
    } 
}]) 
+0

Благодарим за быстрый ответ, вы тоже решили мою проблему. : D –

+0

@MarcoTribuzio этот ответ не просто решает вашу проблему, а показывает, как вы должны это делать. Вы можете обнаружить, что это трудно переварить. Он будет работать лучше. – styvane

Смежные вопросы