2015-03-01 2 views
0

Я пытаюсь извлечь документ из mongodb и удалить некоторые объекты из массива на основе условия (deleted != null). Вот упрощенный пример этого пункта я таргетирование:Вычесть поддокументы из коллекции в сводном конвейере

{ 
    "_id" : ObjectId("54ec9cac83a214491d2110f4"), 
    "name" : "my_images", 
    "images" : [ 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2311026b0cb289ed04188"), 
      "deleted" : null, 
      "date_added" : ISODate("2015-02-28T21:20:16.961Z"), 
     }, 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2314a26b0cb289ed04189"), 
      "deleted" : ISODate("2015-02-24T15:38:14.826Z"), 
      "date_added" : ISODate("2015-02-28T21:21:14.910Z"), 
     }, 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2315526b0cb289ed0418a"), 
      "deleted" : null, 
      "date_added" : ISODate("2015-02-28T21:21:25.042Z"), 
     }, 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2315d26b0cb289ed0418b"), 
      "deleted" : null, 
      "date_added" : ISODate("2015-02-28T21:21:33.081Z"), 
     } 
    ] 
} 

Успешный запрос возвратит то же, но с одним из объектов изображений удалено, как это имеет ISODate, а не нулевой. Как это:

{ 
    "_id" : ObjectId("54ec9cac83a214491d2110f4"), 
    "name" : "my_images", 
    "images" : [ 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2311026b0cb289ed04188"), 
      "deleted" : null, 
      "date_added" : ISODate("2015-02-28T21:20:16.961Z"), 
     }, 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2315526b0cb289ed0418a"), 
      "deleted" : null, 
      "date_added" : ISODate("2015-02-28T21:21:25.042Z"), 
     }, 
     { 
      "ext" : "jpeg", 
      "type" : "image/jpeg", 
      "_id" : ObjectId("54f2315d26b0cb289ed0418b"), 
      "deleted" : null, 
      "date_added" : ISODate("2015-02-28T21:21:33.081Z"), 
     } 
    ] 
} 

Я попытался с помощью агрегата для $unwind изображений затем $match только соответствующие изображениям, но я теперь нужно восстановить документ, в противном случае возвращается оставшиеся 3 «разматывают» документов.

Вот где я до сих пор:

Collection.aggregate([ 
     { $match: 
      { _id: ObjectID(collection_id) } 
     }, 
     { $unwind: "$images" }, 
     { $match: 
      { "images.deleted": null } 
     } 

     // Next step in the pipeline to 
     // reconfigure into one document 
     // goes here 

    ], function (err, result) { 
    if (err) { 
     console.log(err); 
     return; 
    } 
    console.log(result); 
}); 

Есть ли способ, чтобы создать один документ из того, что остается, или я буду об этом в совершенно неправильном направлении?

Спасибо.

ответ

0

Как вы уже упоминали, вам необходимо повторно сгруппировать размороженные отфильтрованные документы обратно в их исходную форму. Вы можете сделать это с $group:

Collection.aggregate([ 
     { $match: 
      { _id: ObjectID(collection_id) } 
     }, 
     { $unwind: "$images" }, 
     { $match: 
      { "images.deleted": null } 
     }, 

     // Regroup the docs by _id to reassemble the images array 
     {$group: { 
      _id: '$_id', 
      name: {$first: '$name'}, 
      images: {$push: '$images'} 
     }} 

    ], function (err, result) { 
    if (err) { 
     console.log(err); 
     return; 
    } 
    console.log(result); 
}); 
+0

У меня было нечто подобное, но $ первое это то, что мне не хватало. В приведенном выше примере была очень упрощенная коллекция, на самом деле имеется гораздо больше полей. Нужно ли мне сначала использовать $ first для каждого поля или есть способ обледенения пройти все это (за исключением «изображений», которые будут использовать $ push)? Еще раз спасибо. – Simon

+0

@Simon Нет, вам нужно явно указать каждое поле в '$ group'. – JohnnyHK

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