MongoDB - Как найти документ по Id и найти документы, которые совпадают с массивом идентификаторов - PullRequest
0 голосов
/ 22 февраля 2019

У меня следующая проблема, у меня много документов, следующих этой структуре в моей коллекции

{
"_id": ObjectId("5c6ec80df2f9d02d08ce6b3c"),
"id": "0", 
"name": "first",
"details": "these are the details of each doc",
"relatedDocsIds": ["1","2"]
}

Параметр "id" не повторяется в коллекции.

Я хочу получитьполные документы с идентификаторами, которые имеют relatedDocsIds.

Я даю «идентификатор» документа, от которого я хочу получить полный связанный документ из массива идентификаторов.

Так что в этомНапример, я хочу получить связанные документы документа с «0», идентификатор его связанных документов хранится в массиве «relatedDocsIds».

Как будет этот запрос?

Я в бэкэнде nodejs, и мне нужно, чтобы ответом был json, содержащий документы этого запроса.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я думаю, что проще всего использовать операторы массивов запросов MongoDB

массивы запросов MongoDB

MongoDB $ в операторе

Пример:

getCollection('collectionName').find({
  relatedDocsIds: {
    $in: ['0']
  }
})
0 голосов
/ 22 февраля 2019

для этого следует использовать mongodb aggregate в сочетании с операторами $unwind и $lookup.

$ unwind Деконструирует поле массива из входных документов для вывода документа для каждого элемента.

$ lookup Выполняет левое внешнее объединение с незащищенной коллекцией в той же базе данных для фильтрации документов из «объединенной» коллекции для обработки.

вот последний запрос:

db.yourCollection.aggregate([
  {
    $unwind: "$relatedDocsIds"
  },
  {
   $lookup:{
       from: "yourCollection",
       localField: "relatedDocsIds",
       foreignField: "id",
       as: "relatedDocs"
    }
  }
])

В mongoose вы можете сделать это следующим образом:

Model.aggregate([
  {
    $unwind: "$relatedDocsIds"
  },
  {
   $lookup:{
       from: "yourCollection",
       localField: "relatedDocsIds",
       foreignField: "id",
       as: "relatedDocs"
    }
  }
]).exec((err, docs) => {
  if (err) throw err;
  console.log(docs);
});

Я бы порекомендовал идти против этого подхода, потому что у mongoose есть метод заполнения, который позволит вам сделать именно это, и их тесты показываютэто быстрее, чем агрегат mongodb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...