将文档与MongoDB中的内部数组元素变量进行匹配

时间:2018-03-16 08:21:35

标签: mongodb mongodb-query aggregation-framework

我无法理解如何将文档变量与另一个文档变量进行比较。我的目标是匹配所有至少有一本以其母语(母语)编写的书的作者。

但是,在展开图书数组后,我的$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."
        ]
}
...

1 个答案:

答案 0 :(得分:1)

试试这个

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"
            }
        }
    }
])