使用MongoDB基于该记录的值获取不同的记录

Vis*_*rma 5 mongodb nosql sails.js sails-mongo

我有餐厅记录的集合.这个集合中的一些餐馆属于某个团体(连锁型餐厅,例如KfC等),而其他没有任何团体(个别餐厅,不属于任何连锁店).

例如:

餐厅系列

{_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"} 
Run Code Online (Sandbox Code Playgroud)

连锁收藏:

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

{_id:"456",chain_name:"KFC",address_deatils:[]}
Run Code Online (Sandbox Code Playgroud)

我需要用类似的chain_id获取不同的餐厅,即如果它属于某个链条,则只有单个餐厅应该来(chain_id!= 0)

chr*_*dam 3

您可以为此使用聚合框架。聚合管道的第一步是作为$match运算符过滤地址上的餐馆。然后,管道$group阶段将按键对过滤后的文档进行分组chain_id,并将累加器表达式$first应用于$$ROOT每个组的系统变量。您可以使用管道阶段重塑文档$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"
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : "4",
            "title" : "rest4",
            "address" : "somethingx",
            "chain_id" : "0"
        }, 
        {
            "_id" : "1",
            "title" : "rest1",
            "address" : "somethingx",
            "chain_id" : "123"
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)