【问题标题】:MongoDB return if field has more than one result如果字段有多个结果,MongoDB 返回
【发布时间】:2017-04-05 14:38:32
【问题描述】:

我有以下收藏

db.createCollection("BOOK", {TITLE : String, AUTHOR : String, ISBN : Number, 
PUBLISHER: { NAME : String, 
     DATE : Date, 
     CITY : String,
         ADDRESS: [{ STREET : String,
                CITY : String ,
                    ZIP : Number ,
                    STATE : String ,
                    COUNTRY : String }]},
AVAILABLE: Boolean,
PAGES : Number ,
LANGUAGE : String } )

一本书的数据有两个出版商:

db.BOOK.insert({TITLE : 'Southern Lights', AUTHOR : 'Danielle Steel', ISBN : 303041974, 
PUBLISHER: { NAME : 'Random House', 
     DATE : new Date("Apr 23,2002"), 
     CITY : 'New York',
         ADDRESS: { STREET : ['1475 Broadway','375 Hudson Street'],
                CITY : 'New York' ,
                    ZIP : [10019 ,10014],
                    STATE : 'New York' ,
                    COUNTRY : 'US'   } },
AVAILABLE: 'Y',
PAGES : 2042 ,
LANGUAGE : 'English' } )

db.BOOK.insert({TITLE : 'Southern Lights', AUTHOR : 'Danielle Steel', ISBN : 303041974, 
PUBLISHER: { NAME : 'Penguin Publishers' , 
     DATE : new Date("Jan 19,1998"), 
     CITY : 'New York',
         ADDRESS: { STREET : '140 Broadway',
                CITY : 'New York' ,
                    ZIP : 10013,
                    STATE : 'New York' ,
                    COUNTRY : 'US'   } },
AVAILABLE: 'Y',
PAGES : 2042 ,
LANGUAGE : 'English' } )

如果我想检索具有多个出版商的图书的所有信息(例如上面的结果),我应该使用什么查询?我知道有一个大于 ($gt) 的查询,但我不确定在这种情况下如何使用它。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    我会使用以下聚合框架管道:

    db.BOOK.aggregate([
    {
        $group: { _id: { TITLE : "$TITLE", AUTHOR : "$AUTHOR", ISBN : '$ISBN' }, publishers: { $addToSet: '$PUBLISHER'} }}
    },
    {
        $unwind:"$publishers"
    },
    {
        $group: { _id: "$_id", publisherCount: { $sum:1} }
    },
    {
        $match: {publisherCount: { $gte:2} }
    }
    ]);
    

    它将 ISBN 视为一本书的唯一标识符,然后为每本书构建一组出版商。然后计算每本书的出版商,并仅返回出版商数量大于或等于 2 的书籍。

    【讨论】:

    • 所以这将返回所有有多个出版商的书籍的所有信息?
    • 所有信息是指书籍的详细信息?此外,对于具有相同 ISBN 的书籍,它们是否一定是相同的?
    • 我已经修改了我的示例以返回所有字段
    • 是的,所有信息都与书籍详细信息的所有字段相同。谢谢!
    • 完成,根据要求修改示例。以这种方式分组可能不太有效。您可以考虑简单地返回我最初显示的 ISBN 编号,然后进行简单的查找查询以获取详细信息。
    【解决方案2】:

    这需要一个聚合操作,您需要通过 ISBN$group 输入文档(在本例中为集合中的所有文档),在组内添加一个额外的字段(使用 $push)这是一个包含 $$ROOT 文档,其中包含每个组和另一个表示计数的字段(使用累加器 $sum)。

    使用 $match 的下一个管道应该过滤来自 count 字段的分组结果。


    考虑运行以下聚合管道以获得所需的结果:

    db.BOOK.aggregate([
        {
            "$group": {
                "_id": "$ISBN",
                "books": { "$push": "$$ROOT" },
                "count": { "$sum": 1 }
            }
        },
        { "$match": { "count": { "$gt": 1 } } },    
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多