Получить только запрошенный элемент в массиве объектов в коллекции MongoDB и добавить его в другой документ в качестве ссылки - PullRequest
0 голосов
/ 14 июня 2019

Предположим, у вас есть следующие документы в моей коллекции:

{  

"_id":ObjectId("562e7c594c12942f08fe4192"),
"name": "Asset1"
   "shapes":[  
      {  
     "_id": "5cf10fea4cb6352abcfe094b",
         "shape":"square",
         "color":"blue"
      },
      {  
     "_id": "5cf10fea4cb6352abcfe094c",
         "shape":"circle",
         "color":"red"
      }
   ]
},

{  
   "_id":ObjectId("562e7c594c12942f08fe4193"),
   "name": "Asset2"
   "shapes":[  
      {  
     "_id": "5c7524f76792cf28f80793e3"
         "shape":"square",
         "color":"black"
      },
      {  
     "_id": "5c7524f76792cf28f80793e4"
         "shape":"circle",
         "color":"green"
      }
   ]
}
}

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

  Test.find(
    {"shapes.color": "red"}, 

    //Match the exact color
    {
      products: {
        $elemMatch: { color: "red" }
      }
    }
  )

Основная проблема в том, что я хочу добавить этот актив1 и взять только красный цвет, а не весь массив, сославшись на ObjectId("562e7c594c12942f08fe4192") в коллекции test2. Как мне это сделать, используя Mongoose?

Это схема Test2, на которую я ссылался

const Test2Schema = new Schema({
anothername: String,
test1Shape: {
type: mongoose.Schema.Types.ObjectId,
ref: "Test"
  },
});

1 Ответ

0 голосов
/ 14 июня 2019

Используйте приведенный ниже запрос, он использует $ unwind , $ match , $ lookup и $ out

$ unwind - для размотки массива Shapes

$ match - чтобы отфильтровать соответствующий цвет red records

$ lookup - Для поиска соответствующих документов в Test2 Collection

$ out - переопределить коллекцию Test2 с объединенным документом

db.Test1.aggregate([
  {
    $unwind: "$shapes"
  },
  {
    $match: {
      "shapes.color": "red"
    }
  },
  {
    $lookup: {
      from: "Test2",
      localField: "_id",
      foreignField: "_id",
      as: "mergeResult"
    }
  },
  {
    $out: "Test2"
  }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...