Фильтрация документов в коллекции A с использованием информации из коллекции B - как?
Предположим коллекцию А с документами следующей структуры:
{_id: N}
где N является положительным целым числом
И вторая коллекция B с документами следующего вида:
{_id: M, ids: [n1,n2,...]}
с n1,n2,... быть положительными целыми числами
Документы в B эффективно определяют наборы документов из коллекции A.
Это означает, что в коллекции A есть два типа документов:
- документы, значение _id которых содержится хотя бы в одном массиве идентификаторов документа в коллекции B
- и те, чей _id не содержится ни в одном ids-массиве документа в коллекции B
Теперь я понятия не имею, как выполнить следующую задачу с помощью выражения оболочки MongoDB:
Я хотел бы удалить все документы из коллекции A, которые не содержатся ни в одном массиве идентификаторов документа в коллекции B.
Мой интуитивный подход состоял бы в том, чтобы превратить все ids-массивы в набор с агрегатом, а затем использовать этот новый массив для составления запроса в методе удаления, но, похоже, это не работает.
Я пробовал несколько вещей - вот один:
> db.A.find()
{ "_id" : 1 }
{ "_id" : 2 }
{ "_id" : 3 }
{ "_id" : 4 }
{ "_id" : 5 }
{ "_id" : 6 }
{ "_id" : 7 }
{ "_id" : 8 }
> db.B.find()
{ "_id" : ObjectId("53c4c9ae55cdc092a772cb15"), "ids" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("53c4c9b855cdc092a772cb16"), "ids" : [ 3, 4, 5 ] }
> var ids = db.B.aggregate({$unwind:"$ids"},{$group:{_id:0,x:{$addToSet:"$ids"}}})
{ "_id" : 0, "x" : [ 5, 4, 3, 2, 1 ] }
> ids
{ "_id" : 0, "x" : [ 5, 4, 3, 2, 1 ] }
> db.A.find({_id:{$nin:ids.x}})
error: {
"$err" : "Can't canonicalize query: BadValue $nin needs an array",
"code" : 17287
}
1 ответ
Замените свой ids
строка объявления с:
var ids = db.B.aggregate(
{$unwind:"$ids"},
{$group:{_id:0,x:{$addToSet:"$ids"}}}
).next();
На самом деле $unwind
возвращает курсор...