0

我有这样的收藏

{
Country : 'XYZ'
Books : [
         {"name" : "book1", "url" : "book1url", "auth_email" : "emailid1"},
         {"name" : "book2", "url" : "book2url", "auth_email" : "emailid2"},
         {"name" : "book3", "url" : "book3url", "auth_email" : "emailid3"},
         {"name" : "book4", "url" : "book4url", "auth_email" : "emailid4"}
         ..........................................
       ]

}


distinct 'Books.name' and corresponding 'Books.email'
我只想提取
'Books.email' is not = ''

4

1 回答 1

1

不幸的是,目前我能想到的最简单的方法是展开Books数组,仅匹配那些具有电子邮件值的数组,然后形成根文档备份:

db.collection.aggregate([
    {$unwind:'$Books'},
    {$match: {'Books.auth_email':{$nin:['',null]}}},
    {$group: {_id:'$Books.name',email:{$first:'$Books.auth_email'}}}
])

虽然另一种方式也应该有效:

db.collection.aggregate([
    {$unwind:'$Books'},
    {$match: {'Books.auth_email':{$nin:['',null]}}},
    {$group: {_id:'$_id',Country:'$Country',Books:{$addToSet:'$Books'}}}
])

我相信在python中你可以这样做:

self.mongo.aggregate([
    {"$unwind":"$Books"},
    {"$match": {"Books.auth_email":{"$nin":['',null]}}},
    {"$group": {"_id":"$Books.name","email":{"$first":"$Books.auth_email"}}}
])
于 2013-07-02T11:07:59.533 回答