【问题标题】:Fetch distinct record based on values for that record with MongoDB使用 MongoDB 根据该记录的值获取不同的记录
【发布时间】:2015-06-04 10:31:15
【问题描述】:

我有餐厅记录的集合。这个集合中的一些餐厅属于某个组(连锁式餐厅,例如肯德基等),而其他没有任何组(个人餐厅,不属于任何连锁店) .

示例:

餐厅系列

{_id:"1",title:"rest1",address:"somethingx",chain_id:"123"},
{_id:"2",title:"rest2",address:"somethingx",chain_id:"123"},
{_id:"3",title:"rest3",address:"somethingy",chain_id:"0"},
{_id:"4",title:"rest4",address:"somethingx",chain_id:"0"} 

链子集合:

{_id:"123",chain_name:"VSWEETS",address_deatils:[
                                          {restID:"",address:"somethingx"},
                                          {restID:"",address:"somethingx"}
                                         ]
}

{_id:"456",chain_name:"KFC",address_deatils:[]}

我需要获取具有相似 chain_id 的不同餐厅,即,如果它属于某个连锁店(chain_id !=0),则应该只有一家餐厅来

【问题讨论】:

  • 你能发布你的输出吗?
  • 如果我在餐厅搜索地址“somethingx”。我需要得到以下结果 {_id:"1",title:"rest1",address:"somethingx",chain_id:"123"}, {_id:"4",title:"rest4",address:"somethingx" ,chain_id:"0"}
  • 仍然不清楚你是否通过address:somethingx然后使用哪个集合来找到RestaurantChain以及与使用的关系,你在chain_id !=0中提到并且输出包含{_id:"4",title:"rest4",address:"somethingx",chain_id:"0"} 跨度>
  • 抱歉混淆@yogesh。我需要查询餐厅的集合。

标签: mongodb sails.js sails-mongo nosql


【解决方案1】:

您可以为此使用聚合框架。聚合管道的第一步是 $match 运算符,用于过滤地址上的餐馆。然后,$group 管道阶段将按 chain_id 键对过滤后的文档进行分组,并将累加器表达式 $first 应用于 $$ROOT strong> 每个组的系统变量。您可以使用$project 管道阶段重塑文档。

为您提供所需结果的最终聚合管道如下:

db.restaurant.aggregate([
    {
        "$match": { "address" : "somethingx" }
    },
    {
        "$group": {
            "_id": "$chain_id",
            "data": { "$first": "$$ROOT" }
        }
    },
    {
        "$project": {
            "_id" : "$data._id",
            "title" : "$data.title",
            "address" : "$data.address",
            "chain_id" : "$data.chain_id"
        }
    }
])

输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : "4",
            "title" : "rest4",
            "address" : "somethingx",
            "chain_id" : "0"
        }, 
        {
            "_id" : "1",
            "title" : "rest1",
            "address" : "somethingx",
            "chain_id" : "123"
        }
    ],
    "ok" : 1
}

【讨论】:

  • 谢谢,非常感谢您的帮助。这个答案接近我真正需要的。你能帮我分页和排序吗
  • @VishalSharma 不用担心,很高兴能为您提供帮助。至于分页和排序,请考虑应用以下管道运算符:$limit 限制结果中的文档数量,$skip 跳过第一个 n 文档,其中 n 是指定跳过编号并将剩余未修改的文档传递给管道,最后$skip通过指定的排序键对结果中的文档重新排序。
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2022-11-25
  • 2021-07-13
相关资源
最近更新 更多