在MongoDB中将文档与其内部数组元素变量匹配



我不明白如何将一个文档变量与另一个文档变量进行比较。我的目标是匹配所有至少有一本用母语(母语(写书的作者。

但是,在展开书籍数组后,My $match: { mothertongue: "$bookLang"}} 不会返回任何内容,即使它们在$project阶段是相同的。

你能在没有javascript的情况下帮助我吗?

这是我当前的查询:

db.author.aggregate([
 {
  $unwind: "$books"
 },
 {
  $project: {
    books: true,
    mothertongue: true,
    bookLang: "$books.lang"
  }
 },
 { 
  $match: { mothertongue: "$bookLang"}
 }
 ])

这是数据集的示例

{
        "_id" : ObjectId("5aa7b34a338571a7470be0eb"),
        "fname" : "Minna",
        "lname" : "Canth",
        "mothertongue" : "Finnish",
        "birthdate" : ISODate("1844-03-19T00:00:00Z"),
        "deathdate" : ISODate("1897-05-12T00:00:00Z"),
        "books" : [
                {
                        "title" : "Anna Liisa",
                        "lang" : "Finnish",
                        "language" : "finnish",
                        "edition" : 1,
                        "cover" : "Hard",
                        "year" : 1895,
                        "categorytags" : [
                                "Finland"
                        ],
                        "publisher" : [
                                {
                                        "name" : "Tammi",
                                        "pubId" : ObjectId("5aa7b34a338571a7470be0e4")
                                }
                        ]
                },
                {
                        "title" : "The Burglary and The House of Roinila",
                        "lang" : "English (UK)",
                        "translator" : ObjectId("5aa7b34a338571a7470be0ee"),
                        "cover" : "Soft",
                        "year" : 2010,
                        "categorytags" : [
                                "Finland"
                        ],
                        "publisher" : [
                                {
                                        "name" : "Jonathan Cape",
                                        "pubId" : ObjectId("5aa7b34a338571a7470be0e7")
                                }
                        ]
                },
                {
                        "title" : "Anna Liisa 2 ed.",
                        "lang" : "Finnish",
                        "language" : "finnish",
                        "edition" : 2,
                        "cover" : "hard",
                        "year" : 1958,
                        "categorytags" : [
                                "Finland"
                        ],
                        "publisher" : [
                                {
                                        "name" : "Otava",
                                        "pubId" : ObjectId("5aa7b34a338571a7470be0e9")
                                }
                        ]
                }
        ]
}

最终目标。注意我还对格式化不感兴趣,只是过滤

{
        "Author" : "Charles Bukowski",
        "BooksInMothertongue" : [
                "Love Is a Dog from Hell"
        ]
}
{
        "Author" : "Minna Canth",
        "BooksInMothertongue" : [
                "Anna Liisa",
                "Anna Liisa 2 ed."
        ]
}
...

试试这个

db.author.aggregate([{
        $match: {
            books: {
                $ne: []
            }
        }
    },
    {
        $project: {
            books: {
                $filter: {
                    input: "$books",
                    as: "book",
                    cond: {
                        $eq: ["$$book.lang", "$mothertongue"]
                    }
                }
            },
            fname: 1
        }
    }, {
        $unwind: "$books"
    },
    {
        $group: {
            _id: "$_id",
            Author: {
                $first: '$fname'
            },
            BooksInMothertongue: {
                $push: "$books.title"
            }
        }
    }
])

最新更新