MongoDB mongoose $lookup 不在数组中。

Posted

技术标签:

【中文标题】MongoDB mongoose $lookup 不在数组中。【英文标题】:MongoDB mongoose $lookup not in array. 【发布时间】:2018-08-16 15:31:39 【问题描述】:

我使用以下查询:

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,
  
]

【问题讨论】:

尝试使用 $unwind 或 $project 【参考方案1】:

3.6版本可以使用$mergeObject操作符。

$mergeObject 将合并的集合字段与其他字段合并,然后$replaceRoot 将合并的文档提升到顶层。

$project 排除以删除 model 字段。

$lookup之后添加以下阶段

 [
  
    "$replaceRoot": 
      "newRoot": 
        "$mergeObjects": [
          
            "$arrayElemAt": [
              "$model",
              0
            ]
          ,
          "$$ROOT"
        ]
      
    
  ,
  
    "$project": 
      "model": 0
    
  
]

【讨论】:

以上是关于MongoDB mongoose $lookup 不在数组中。的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 聚合 - $lookup 性能

Mongoose.aggregate(pipeline) 使用 $unwind、$lookup、$group 链接多个集合

Mongodb $lookup 返回空数组

Mongoose:$lookup 后的 $project 不显示字段

Mongoose,使用 $lookup 的聚合查询返回 null?

Mongoose $lookup 聚合没有按预期工作