MongoDB $ setUnion для объекта ($ setUnion, но с дополнительной информацией) - PullRequest
0 голосов
/ 17 января 2019

сообщество stackoverflow, Я не часто работаю с большими массивами объектов в mongodb поэтому я понятия не имею, как решить эту проблему:

1. я работаю в одном файле, так что, очевидно, это ведьма aggregate, во-первых, делает {$match:{"_id" : ObjectId("5c3f5cb04147b3082648278b") }},

2. Хорошо, теперь у меня есть еще один шаг - $ project + $ filter для фильтрации некоторых объектов, но это не важно для этого (я думаю)

  1. У меня есть массив объектов, подобных этому

    { "_id": ObjectId (".."), "данные": [

    {
      id : 01,
      groupId: 22,
      noteId: 876543
    },
    {
      id : 02,
      groupId: 33,
      noteId: 767676
    },
    {
      id : 03,
      groupId: 22,
      noteId: 876543
    },
    {
      id : 04,
      groupId: 76,
      noteId: 876543
    }
    

    ] }

но с тысячами записей и большим количеством значений для объекта.

У каждого groupId может быть любой noteId, но у одинаковых групп всегда один и тот же noteId. Проблема: ноты могут быть разделены между группами.

Я добавил это

{ $project: {
                "groupIds": {"$setUnion": "$data.groupId"}
            }}

ведьма дает мне все идентификаторы группы но очень важно, чтобы я также получил все связанные noteId, потому что это произвольный идентификатор по отношению к чему-либо еще.

возможно ли как-то объединить объект по указанному полю? или есть другой способ решить это? Если бы я мог фильтровать объекты с $ in ($ data.groupId, $ setUnion («объединение сверху»), я все равно не знал бы, как извлечь только те 2 поля, которые мне нужны.

заранее спасибо за помощь

H.M.

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$unwind": "$data" },
  { "$group": {
    "_id": {
      "_id": "$_id",
      "groupId": "$data.groupId"
    },
    "noteIds": {
      "$push": {
        "noteId": "$data.noteId",
      }
    }
  }},
  { "$group": {
    "_id": "$_id._id",
    "data": {
      "$push": {
        "groupId": "$_id.groupId",
        "noteIds": "$noteIds"
      }
    }
  }}
])
...