我使用以下查询:
Collection
.aggregate([
{
$project : { follow_count: {$size: { "$ifNull": [ "$follow_users", [] ] } } }
},
{ $lookup: {from: 'models', localField: '_id', foreignField: '_id', as: 'model'}},
])
获得这种JSON:
[
{
"_id": "1234565434567",
"follow_count": 3,
"model": [
{
"_id": "1234565434567",
"make": "Make1",
"name": "Model1",
"price": 15200,
}
]
},
{
"_id": "123456789",
"follow_count": 2,
"model": [
{
"_id": "123456789",
"make": "Make2",
"name": "Model2",
"price": 12000,
}
]
}
]
有没有办法不在数组中推送$ lookup结果来获得类似的JSON? 我更喜欢在查询后不使用循环,所以我正在寻找一种优化的方法。
[
{
"_id": "1234565434567",
"follow_count": 3,
"make": "Make1",
"name": "Model1",
"price": 15200,
},
{
"_id": "123456789",
"follow_count": 2,
"make": "Make2",
"name": "Model2",
"price": 12000,
}
]
答案 0 :(得分:1)
您可以在3.6版本中使用$mergeObject
运算符。
$mergeObject
将已加入的集合字段与其他字段合并,后跟$replaceRoot
,以将合并的文档提升到最高级别。
$project
并排除model
字段。
在$lookup
[
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"$arrayElemAt": [
"$model",
0
]
},
"$$ROOT"
]
}
}
},
{
"$project": {
"model": 0
}
}
]