根据条件加入mongodb集合[重复]

Posted

技术标签:

【中文标题】根据条件加入mongodb集合[重复]【英文标题】:Joining mongodb collection based on condition [duplicate] 【发布时间】:2020-03-30 09:14:48 【问题描述】:

我在 MongoDB 中有两个集合,并希望根据某些条件加入这两个集合。

我想加入 'order' 和 'order-status' 表以获取所有分配给 '123' 且状态为 'ready' 的订单

订单


 "_id":"1",
 "name": "Fridge",
 "assignee": "123"
,

 "_id":"2",
 "name": "TV",
 "assignee": "567"
,

 "_id":"3",
 "name": "Music system",
 "assignee": "123"

订单状态


 "_id":"1",
 "status": "ready",
 "orderId": "1"
,

 "_id":"2",
 "status": "cancelled",
 "orderId": "2"
,

 "_id":"3",
 "status": "cancelled",
 "orderId": "3"

受让人


 "_id":"123",
 "name": "Jak"


 "_id":"567",
 "name": "Mac"

我想加入 'order' 和 'order-status' 表以获取所有分配给 '123' 且状态为 'ready' 的订单

期待最终结果

[

 "_id":"1",
 "name": "Fridge",
 "assignee": "123",
 "status": 
  "_id":"1",
 "status": "ready",
 "orderId": "1"
 

]

尝试了以下但如何使用查找检查另一个表中的订单状态

const resultObject = orders.aggregate([
   $match : assignee: Objectid('123') ,
  
    $lookup: 
      from: 'user-status',
      localField: 'assignee',
      foreignField : '_id',
      as : 'assignee'
    
  ,
  
    $unwind: '$assignee'
  
]);

【问题讨论】:

你能给受让人提供样本数据吗? @SuleymanSah 我有疑问,我是否需要将受理人放入订单状态表中以获得数据库正确参考?即“受让人”:“123” 能否提供样本数据以便我们检查? @SuleymanSah 更新受让人收藏 嗯,其实不需要加入assignee,我已经回复了,可以查一下吗? 【参考方案1】:

首先你需要使用match来过滤"assignee": "123",然后你需要查找order-status,匹配"orderStatus.status": "ready"

const resultObject = orders.aggregate([
  
    $match: 
      assignee: "123"
    
  ,
  
    $lookup: 
      from: "order-status",
      localField: "_id",
      foreignField: "orderId",
      as: "statuses"
    
  ,
  
    $match: 
      "statuses.status": "ready"
    
  ,
  
    $project: 
      id: "_id",
      name: "$name",
      assignee: "$assignee",
      status: 
        $arrayElemAt: ["$statuses", 0]
      
    
  
]);

这将给出如下结果:

[
  
    "_id": "1",
    "assignee": "123",
    "name": "Fridge",
    "status": 
      "_id": "1",
      "orderId": "1",
      "status": "ready"
    
  
]

Playground

【讨论】:

【参考方案2】:

我会使用以下管道:

const resultObject = orders.aggregate([
    
        $match: 
            assignee: Objectid('123')
        
    ,
    
        $lookup:
            
                from: "order-status",
                let: order_id: "$_id",
                pipeline: [
                    
                        $match:
                            
                                $expr:
                                    
                                        $and:
                                            [
                                                $eq: ["$orderId", "$$order_id"],
                                                $eq: ["$status", "ready"]
                                            ]
                                    
                            
                    
                ],
                as: "stock"
            
    ,
    
        $unwind: "$stock"
    ,
    // now we get the assignee info.
    
        $lookup: 
            from: 'user-status',
            localField: 'assignee',
            foreignField: '_id',
            as: 'assignee'
        
    ,
    
        $unwind: '$assignee'
    ,
    //finaly create the required structure.
    
        $project: 
            name: "$assignee.name",
            assignee: "$assignee._id",
            status: "$stock.0"
        
    
]);

【讨论】:

以上是关于根据条件加入mongodb集合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB和“加入”[重复]

MongoDB的启动与停止

MongoDB

mongodb 副本集合学习 window环境下/

mongodb基本操作

将MongoDB服务加入随机启动