web-dev-qa-db-ja.com

mongodb集計で文字列の配列を返す方法

Mongodb集計で文字列の配列を返す必要があります。私は次のことをしました:

db.users.aggregate([{$group: {_id:"$emails.address"}}])

それは戻ります:

{ "_id" : [ "[email protected]" ] }
{ "_id" : [ "[email protected]" ] }
{ "_id" : [ "[email protected]" ] }

このような文字列の配列を返す方法はありますか?

["[email protected]","[email protected]","[email protected]"]

私を助けてくれてありがとう。

[〜#〜]編集[〜#〜]

データの追加:

{
    "_id" : "ukn9MLo3hRYEpCCty",
    "createdAt" : ISODate("2015-10-24T03:52:11.960Z"),
    "emails" : [
        {
            "address" : "[email protected]",
            "verified" : false
        }
    ]
}
{
    "_id" : "5SXRXraariyhRQACe",
    "createdAt" : ISODate("2015-10-24T03:52:12.093Z"),
    "emails" : [
        {
            "address" : "[email protected]",
            "verified" : false
        }
    ]
}
{
    "_id" : "WMHWxeymY4ATWLXjz",
    "createdAt" : ISODate("2015-10-24T03:52:12.237Z"),
    "emails" : [
        {
            "address" : "[email protected]",
            "verified" : false
        }
    ]
}
6
user4804299

.aggregate()メソッドは、何をしても常にObjectsを返し、それを変更することはできません。

目的のために、代わりに .distinct() を使用する方がおそらく良いでしょう。これは、個別の値の配列を返すだけです。

_db.users.distinct("emails.address");
_

これはまさにあなたの望む出力です:

_["[email protected]","[email protected]","[email protected]"]
_

本当に.aggregate()を使用したい場合は、値だけへの変換は、後処理で式の「外側」で行う必要があります。また、このような配列を処理するときは、_$unwind_も使用する必要があります。

これは、JavaScript .map()を使用して実行できます。例:

_db.users.aggregate([
    { "$unwind": "$emails" },
    { "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
_

これは同じ出力を提供しますが、.map()はサーバーではなくクライアント側で変換を行います。

16
Blakes Seven

ブレイクス7が答えた 正しい。

.aggregate()メソッドは、何をしても常にオブジェクトを返し、変更することはできません。

ただし、それは、それらを配列に入れて、オブジェクトで配列を返すことができないという意味ではありません。

ノードサーバーは他のリクエストでも引き続き利用できるため、データベース自体の配列でのマッピングの方が優れていると思います。

db.users.aggregate([
     { "$unwind": "$emails" },
     { "$group": { "_id": null, emails:{$Push:"$emails.address"} } },
     { "$project":{emails:true,_id:false}}
 ])

これは戻ります:

{ "emails" : [ "[email protected]", "[email protected]", "[email protected]" ] }
5
Dushyant Bangal