Я пытаюсь извлечь документ из 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);
});
Есть ли способ, чтобы создать один документ из того, что остается, или я буду об этом в совершенно неправильном направлении?
Спасибо.
У меня было нечто подобное, но $ первое это то, что мне не хватало. В приведенном выше примере была очень упрощенная коллекция, на самом деле имеется гораздо больше полей. Нужно ли мне сначала использовать $ first для каждого поля или есть способ обледенения пройти все это (за исключением «изображений», которые будут использовать $ push)? Еще раз спасибо. – Simon
@Simon Нет, вам нужно явно указать каждое поле в '$ group'. – JohnnyHK