查找管道:``$ match`本地字段in` in'raray in array in array in value是阵



我有2个集合。我想在匹配ID的集合上进行汇总。从那里,我想从集合b查找,其中收集A(本地字段(的匹配ID位于集合B(外域(的数组中。

基本上:

集合A:

{
    _id: ObjectId('<id>')
},
{
    _id: ObjectId('<id>')
},
{
    _id: ObjectId('<id>')
}

集合B:

{
    _id: ObjectId('<id>'),
    related: ['<id>', '<id>', '<id>', '<id>']
},
{
    _id: ObjectId('<id>'),
    related: ['<id>', '<id>', '<id>', '<id>']
},
{
    _id: ObjectId('<id>'),
    related: ['<id>', '<id>', '<id>', '<id>']
}

查询:

db.collection_a.aggregate({
    [$match: {_id: ObjectId('<id>')}],
    // other $lookups...
    [
        $lookup: {
            as: 'collection_b',
            from: 'collection_b',
            let: {id: '$_id'},
            pipeline: [
                {
                    $match: {
                        $expr: {$in: ['$related', '$$id']}
                    }
                }
                // sorts, projections, etc...
            ]
        }
    ]
    // sorts, projections, etc...
});

所需结果:

[
    {
        _id: ObjectId('<id>'),
        collection_b: [
            {
                _id: ObjectId('<id>'),
                related: ['<id>', '<id>', '<id>', '<id>']
            },
            {
                _id: ObjectId('<id>'),
                related: ['<id>', '<id>', '<id>', '<id>']
            }
        ]
    },
]

结果:

$in requires an array as a second argument, found: objectId

现在,我知道可以将其切换并查找A上的集合A在集合B上是可能的,但是,在这种情况下,这不是一个选项(即使收集A在集合b(。最好将其保存到一个查询。

任何帮助都非常感谢。

您可以尝试一下:

db.collection_a.aggregate(
[{ $match: { _id: ObjectId(' ') } },
// other $lookups...
{
    $lookup: {
        as: 'collection_b',
        from: 'collection_b',
        let: { id: { $toString: '$_id' } },
        pipeline: [
            {
                $addFields: {
                    "related": {
                        "$cond": {
                            "if": {
                                "$ne": [{ "$type": "$related" }, "array"]
                            },
                            "then": [],
                            "else": "$related"
                        }
                    }
                }
            },
            {
                $match: {
                    $expr: { $in: ['$$id', '$related'] }
                }
            }
            // sorts, projections, etc...
        ]
    }
}
           // sorts, projections, etc...
]);

所说的$in将数组作为第二个参数,而您要搜索的值是第一个参数。

最新更新