【问题标题】:Find document then get all related documents查找文档然后获取所有相关文档
【发布时间】:2020-09-15 14:56:21
【问题描述】:

我有这个 mongodb 文档:

{
    "_id" : ObjectId("5e382d27bb4bd5ce3ef5fb1d"),
    "code" : "25116",
    "datecrea" : "2015-11-14 18:23:24",
    "datemodif" : "2015-11-14 18:23:24",
    "datas" : {
        "songId" : 25116,
        "artistId" : 128,
        "albumId" : 1822,
        "name" : "Free Me",
        "songTrack" : 10,
        "genres" : [ 
            "24"
        ],
    }
}

我想提出一个请求,按其流派(流派的array)搜索歌曲,然后根据datas.artistIddatas.albumId 字段。

我试过这个查询:

db.getCollection('songs').aggregate([
{ $elemMatch: { "datas.genre": 31 } },
{ $lookup: { from: "artists", localField: "datas.artisId", foreignField: "code", as: "artist" } },
{ $unwind: "$artist"}
])

但它返回一个错误,知道我对 mongodb 完全是新闻。 感谢大家的帮助

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    离你不远了。您只有两个小语法错误。

    1. $elemMatch,无需过多介绍。 $elemMatch 不是流水线阶段,不能在 aggregate 操作中使用。它通常用于find 查询。

    2. 在查找中您写了datas.artisId 而不是datas.artistId

    所以改变你的管道:

    
    db.getCollection('songs').aggregate([
        { $match: { "datas.genre": 31 } },
        { $lookup: { from: "artists", localField: "datas.artistId", foreignField: "code", as: "artist" } },
        { $unwind: "$artist"}
    ])
    

    还有一个有趣的事实,与实际代码无关,data 这个词已经是它的复数形式了。因此datas 是一个语法错误。如果您想知道data 的单数形式是datum

    【讨论】:

    • 非常感谢您的回复,问题是字段datas.genre, 是一个数组,我要查询的是数组中是否存在值31 ,但是当我使用$match 管道运行aggregate 函数时,它返回0 records
    • 即使是一个数组,语法也有效。我的猜测是没有艺术家被匹配,然后$unwind 使这些文件消失。尝试在没有$unwind 阶段或使用preserveNullAndEmptyArrays 标志的情况下运行它。
    • 也可以确保31 存储为数字而不是字符串,或者搜索"31",以防它不是。
    • 非常感谢,是作品,有一些字段名称错误 "genre" => "genres" 并且流派元素确实是字符串
    • 很好,我也错过了!
    猜你喜欢
    • 2020-07-27
    • 2017-02-28
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多