mongo db如何加入集合

时间:2018-01-15 09:32:42

标签: node.js mongodb mongoose

如何在mongo db 3.2

中获取连接全部外部记录

库存收集

db.inventory.insert([
{ "_id" : 1, "coin_id" : "12345", description: "product 1"},
{ "_id" : 2, "coin_id" : "12346", description: "product 2"},
])

订单收集

db.orders.insert([
{ "_id" : 1, "coin_id" : "12345", "user_id" : 11, "bal" :1000 },
])

这里的场景就是这样。我想基于coin_id从库存集合中获取reocrd,然后从订单集合中匹配记录。但如果订单收集不匹配,则至少会提供库存记录。

我的代码 - :

db.inventory.aggregate([
{
    $lookup:
    {
       from: 'orders',
       localField: 'coin_id',
       foreignField: 'coin_id',
       as: 'coin_details'
    }
},  {$match : {'coin_details.user_id':'11')}}

每当user_id为空或不可用时,我总是希望记录库存记录 如果有其他可能性,请告诉我。请指导我怎么做。

2 个答案:

答案 0 :(得分:2)

应更改$match条件以满足“匹配用户ID或无匹配订单”的要求:

db.inventory.aggregate([
    { 
        $lookup:
        {
            from: 'orders',
            localField: 'coin_id',
            foreignField: 'coin_id',
            as: 'coin_details'
        }
    },  
    { $match : {$or: [
        {'coin_details.user_id':11}, 
        {'coin_details':{$size:0}}
    ] } }
] )

作为旁注,user_id是示例文档中的数字,因此它应该在查询中。

答案 1 :(得分:0)

删除$match管道,如果找不到匹配项,它将返回带有空数组的库存文档

db.inventory.aggregate([
{
    $lookup:
    {
       from: 'orders',
       localField: 'coin_id',
       foreignField: 'coin_id',
       as: 'coin_details'
    }
}
])