我有两个收藏品,我们称之为收藏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
那么它就不应该显示任何一个项目
发布于 2017-02-22 09:03:56
您可以使用$lookup操作符首先从collectionA
对collectionB
执行连接,将从$unwind返回的结果返回的单元素数组扁平,然后使用$redact管道进行文档级编辑,其中符合指定条件的文档使用$$KEEP system变量保留,而不满足条件的文档则使用$$PRUNE丢弃。最后,您需要运行以下聚合管道:
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
填充测试集合:
db.collectionA.insert([
{ "name": "item1", "price": 30 },
{ "name": "item2", "price": 20 }
])
db.collectionB.insert([
{ "name": "item1", "price": 50 },
{ "name": "item2", "price": 10 }
])
运行和调试聚合管道:
示例输出:
{
"_id" : ObjectId("58ad50a429b2961777f91c95"),
"name" : "item2",
"price" : 20,
"collectionB" : {
"_id" : ObjectId("58ad50a429b2961777f91c97"),
"name" : "item2",
"price" : 10
}
}
https://stackoverflow.com/questions/42384199
复制相似问题