首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个集合中查找带有值的键

在另一个集合中查找带有值的键
EN

Stack Overflow用户
提问于 2020-01-24 16:16:06
回答 1查看 63关注 0票数 1

我们有一个请求集合,示例文档如下所示:

代码语言:javascript
复制
{
    "_id" : ObjectId("xxxxxx"),
    "requestId" : "REQ4",
    "scrip" : "5647"
}
{
    "_id" : ObjectId("xxxxxx"),
    "requestId" : "REQ4",
    "scrip" : "5648"
}
{
    "_id" : ObjectId("xxxxxx"),
    "requestId" : "REQ1",
    "scrip" : "0001"
}
{
    "_id" : ObjectId("xxxxxx"),
    "requestId" : "REQ1",
    "scrip" : "0456"
}

纸片托收:

代码语言:javascript
复制
{
    "_id" : ObjectId("xxxx"),
    "scrip" : "0001"
}
{
    "_id" : ObjectId("xxxx"),
    "scrip" : "0456"
}
{
    "_id" : ObjectId("xxxx"),
    "scrip" : "5647"
}

我们需要返回的请求,其中有所有对应的凭证在纸片集合。

预期输出:

代码语言:javascript
复制
{"_id" : ObjectId("xxxxxx"),
    "requestId" : "REQ1",
    "scrip" : ["0001","0456"]
}

我们如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-25 04:49:06

试试这个:

代码语言:javascript
复制
db.requests.aggregate([
    /** Filter to reduce dataset */
    { $match: { requestId: { $in: ['REQ4', 'REQ1', 'REQ5'] } } },
    /** check for matching docs based on scrip */
    {
        $lookup:
        {
            from: "scrips",
            localField: "scrip",
            foreignField: "scrip",
            as: "scrips"
        }
    }, { $addFields: { scrips: { $arrayElemAt: ['$scrips', 0] } } },
    /** Group all docs in request collection based on requestId */
    { $group: { _id: '$requestId', scrip: { $push: '$scrip' }, scrips: { $push: '$scrips' } } },
    /** Remove request docs if all request docs doesn't have match in scrips */
    { $match: { $expr: { $eq: [{ $size: '$scrip' }, { $size: '$scrips' }] } } },
    /** Transform final result */
    { $project: { _id: 0, requestId: '$_id', scrip: 1 } }
])

测试: MongoDB-游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59900166

复制
相关文章

相似问题

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