首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何聚合来自一个集合的字段大于另一个集合的两个集合

如何聚合来自一个集合的字段大于另一个集合的两个集合
EN

Stack Overflow用户
提问于 2017-02-22 06:28:46
回答 1查看 733关注 0票数 2

我有两个收藏品,我们称之为收藏A和收藏B,它们都有一个价格字段和商品编号。因此,假设每个项目有2项:

收藏品A:

名称= item1,价格= 30 名称= item2,价格= 20

收藏品B:

名称= item1,价格= 50 名称= item2,价格= 10

我想显示的项目,收集A的价格是大于收集B的价格。例如,对于上面的示例,将是item2。

我如何编写这样的查询呢?我在用robomongo。

(编辑)

跟进我先前的问题;

我想显示托收A的价格大于托收B的价格*(汇率)+(一些常数)的物品。

假设条件是;

A的价格>B的price*1.5+4

因此,在这种情况下,它仍然应该显示相同的项目。

假设条件是;

A的价格>B的price*1.5+10

那么它就不应该显示任何一个项目

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-22 09:03:56

您可以使用$lookup操作符首先从collectionAcollectionB执行连接,将从$unwind返回的结果返回的单元素数组扁平,然后使用$redact管道进行文档级编辑,其中符合指定条件的文档使用$$KEEP system变量保留,而不满足条件的文档则使用$$PRUNE丢弃。最后,您需要运行以下聚合管道:

代码语言:javascript
运行
复制
var exchangeRate = 1.5;
db.collectionA.aggregate([
    { "$match": { "price": { "$exists": true }, "name": { "$exists": true } } },
    {
        "$lookup": {
            "from": "collectionB",
            "localField": "name",
            "foreignField": "name",
            "as": "collectionB"
        }
    },
    { "$unwind": "$collectionB" },
    {
        "$redact": {
            "$cond": [
                { 
                    "$gt": [
                        "$price", {
                            "$add": [
                                { "$multiply": [ "$collectionB.price", exchangeRate ] },
                                4
                            ]
                        }
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Robomongo Demo

填充测试集合:

代码语言:javascript
运行
复制
db.collectionA.insert([
    { "name": "item1", "price": 30 },
    { "name": "item2", "price": 20 }    
])

db.collectionB.insert([
    { "name": "item1", "price": 50 },
    { "name": "item2", "price": 10 }    
])

运行和调试聚合管道:

示例输出:

代码语言:javascript
运行
复制
{
    "_id" : ObjectId("58ad50a429b2961777f91c95"),
    "name" : "item2",
    "price" : 20,
    "collectionB" : {
        "_id" : ObjectId("58ad50a429b2961777f91c97"),
        "name" : "item2",
        "price" : 10
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42384199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档