Фильтрация документов в коллекции 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 возвращает курсор...

Другие вопросы по тегам