【问题标题】:mongo db how to join collectionsmongodb如何加入集合
【发布时间】:2018-06-23 22:02:21
【问题描述】:

如何在 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 为空或不可用时,我总是想从库存记录中记录 如果有任何其他可能性,请告诉我。请指导我如何做。

【问题讨论】:

  • 更改或删除$match 阶段。它过滤掉没有匹配顺序的记录。
  • 但我想要这个比较。因为我想要根据 user_id 的值。如果集合中不存在,则可以,但如果存在,则我想要。
  • 当然,但是您当前版本中的$match 说“只保留user_id 为11 的记录”。没有任何“如果它不存在”。更改“$match”以满足您的要求。
  • 谢谢,你能指导我在这个阶段如何可能吗?

标签: node.js mongodb mongoose


【解决方案1】:

$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 是示例文档中的一个数字,因此它应该在查询中。

【讨论】:

  • 感谢它的工作,但我们可以管理库存记录的限制,因为它提供了库存的所有记录。
  • 但这正是您所问的:每当 user_id 为空或不可用时,我总是想从库存记录中记录。您可以修改$match 以更严格的条件只获取您感兴趣的文档,或使用docs.mongodb.com/manual/reference/operator/aggregation/limit 获取符合条件的“前n”个文档。
【解决方案2】:

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

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

【讨论】:

  • 但我想要这个比较。因为我想要根据 user_id 的值。如果它在收藏中不存在,那么它会好的,但如果存在,那么我想要
  • 如果user_id不存在你想做什么?
  • 在那种情况下,我总是想盘点收集记录。
  • 这将显示库存甚至订单或 user_id 不退出
  • 您可以发布示例文件和预期结果吗?
猜你喜欢
  • 2022-01-01
  • 2016-10-22
  • 2012-04-04
  • 1970-01-01
  • 2017-08-10
  • 2021-11-04
  • 2020-09-03
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多