Альтернатива заселения в mongodb? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть массив с именем group, содержащий список идентификаторов, ниже приведен оператор поиска и заполнения, который отлично с этим работает, и я использую заполнение для получения дополнительных данных - запрос ниже:

var stories = await Story
  .find( { 'group' : { $in : group } } )
  .populate('group')
  .populate('createdBy')
  .sort('-created')

У меня есть сводный запрос (ниже), который делает то, что я хочу, но 1) он не использует значения в массиве group, он просто возвращает все содержимое, и 2) я не получаю дополнительные данныедля полей group и createdBy, как я делаю для find выше.

var spellings = await Spelling.aggregate([
  { "$sort": { "keyStageLevel": 1, "spellingLevel": 1 } },
  { "$group" : {
    "_id": { "keyStageLevel": "$keyStageLevel", "class": "$class" },
    "data": {
      "$push": {
        "spellingLevel": "$spellingLevel",
        "class": "$class",
        "name": "$name",
        "spellings": "$spellings",
        "created": "$created",
        "_id": "$_id",
        "group": "$group",
        "createdBy": "$createdBy"
      }
    }
  }},
  { "$sort": { "_id": 1 } }
])

Редактировать - вот пример документа правописания:

 {
    "_id":"5b1ff6f62bb1894efcf76ea0",
    "spellings":["here","are","spellings"],
    "name":"withclass",
    "group":"5ab79a639083cf35339b880a",
    "createdBy":"5ab79185d47b833506ff94b1",
    "created":"2018-06-12T16:38:14.571Z",
 }

Может кто-нибудь помочькак использовать значения в массиве group в моем операторе aggregate и как я могу добавить дополнительные данные для полей group и createdBy, как я делаю для find?

1 Ответ

0 голосов
/ 12 июня 2018

Вы можете попробовать агрегацию ниже $lookup, чтобы заполнить поля group и createdBy

var spellings = await Spelling.aggregate([
  { "$match": { "group": { "$in": group }}},
  { "$sort": { "keyStageLevel": 1, "spellingLevel": 1 } },
  { "$lookup": {
    "from": CreatedBy.collection.name,
    "let": { "createdBy": "$createdBy" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$_id", "$$createdBy" ] } } }
    ],
    "as": "createdBy"
  }},
  { "$lookup": {
    "from": Group.collection.name,
    "let": { "group": "$group" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$_id", "$$group" ] } } }
    ],
    "as": "group"
  }},
  { "$unwind": "$group" },
  { "$unwind": "$createdBy" },
  { "$group" : {
    "_id": { "keyStageLevel": "$keyStageLevel", "class": "$class" },
    "data": {
      "$push": {
        "spellingLevel": "$spellingLevel",
        "class": "$class",
        "name": "$name",
        "spellings": "$spellings",
        "created": "$created",
        "_id": "$_id",
        "group": "$group",
        "createdBy": "$createdBy"
      }
    }
  }},
  { "$sort": { "_id": 1 } }
])
...