Как можно использовать агрегаты в монго для выполнения операций в массиве, встроенном в документ? - PullRequest
0 голосов
/ 02 мая 2018

Допустим, у меня есть коллекция пользователей . Каждый пользователь имеет активов . Есть некоторые статистические показатели, которые я хочу выполнить для активов . Но для того, чтобы сделать это, мне нужно иметь только активы в прогнозе в качестве входных данных для совокупности. Как этого достичь?

Я хочу иметь возможность выполнять несколько агрегатных операций с активами . Эти операции будут включать фильтрацию, ограничение и пропуск, поэтому я буду использовать такие операторы, как $ skip , $ match , $ limit и другие. Но чтобы выполнить эти операции над встроенным массивом, мне нужен оператор, который берет документ user и выводит встроенный в него массив assets .

Просто мне нужен оператор, который берет пользовательский документ со следующей схемой и выводит массив ресурсов, которые я дополнительно выполняю над ним агрегирующими операциями.

user:{
   name: string,
   assets: Asset[],
   age: number
}

Я пробовал эти агрегатные операции, но они не работают, как я ожидал.

db.getCollection('users').aggregate( [ 
{ $match: {_id: ObjectId("5ae837dca9a8e04dd0689824")} } ,
{ $project : { assets: 1  } },
] )

Выводит массив, в котором есть один пользовательский документ, в который встроены ресурсы, как это

[{
"_id" : ObjectId("5ae837dca9a8e04dd0689824"),
"assets" : [{_id:ObjectId("1"), assetName: 'tt' }, {_id : ObjectId("2"), assetName: 'rr'}]
}] 

Мне нужно иметь вывод, подобный приведенному ниже

[
{_id:ObjectId("1"), assetName: 'tt'}, 
{_id:ObjectId("2"), assetName: 'rr'}
]

1 Ответ

0 голосов
/ 02 мая 2018

Два шага для этого (плюс $match):

  • $ unwind для преобразования массива вложенных документов в несколько документов, имеющих один вложенный документ
  • $ replaceRoot для продвижения поддокумента для нового корня

Попытка:

db.users.aggregate([
    { $match: {_id: ObjectId("5ae837dca9a8e04dd0689824")} },
    { $unwind: "$assets" },
    { $replaceRoot: { newRoot: "$assets" } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...