0

mongodb シェルで次の集計をテストしましたが、正常に動作しますが、mongoose では動作しないようです。同様のトピックや問題を検索しましたが、それらの解決策は私のものを解決しません。

ドキュメント構成はこちら

{
  name,
  id,

  contacts:[{
    contactId, //I need an array of this field
    dateAdded
  }, {
    contactId,
    dateAdded
  },
  {}..]
}

マングースのスキーマは次のとおりです。

 var AccountSchema = new mongoose.Schema({
    email:     { type: String, unique: true },
    password:  { type: String },
    name: {
      first:   { type: String },
      last:    { type: String },
      full:    { type: String }
    },
    contacts:  [Contact]
  });

そして、ここに集計があります:

 Account.aggregate({
   $match: { _id: accountId }
 }, {
   $unwind:"$contacts"
 },
 {
   $group: {
     _id: '$_id',
     list: { $push:'$contacts.accountId' }
   }
 }, {
   $project: {
     _id: 0,
     contacts: 1
   }
 }, function(err, doc) {
   // var l=doc.result[0].list;
   callback(doc);  
 });

Mongodb シェルでは、アグリゲーションは以下に示すように contactID の配列を返しますが、Mongoose では空の配列を返します。

{
  "result" : [
    {
      "_id" : null,
      "list" : [
         ObjectId("xxxbnbnb2013-06-23T16:24:03.785Z"),
         ObjectId("mnmnmnmui2013-06-23T16:24:04.688Z")
      ]
    }
  ],
  "ok" : 1
}
4

1 に答える 1

4

クエリは正しくフォーマットされているようです。「リスト」を投影する必要があるときに「連絡先」を投影したと思います。あなたのデータのようにデータをフォーマットしようとしましたが、次のクエリがうまくいきました。シェル内:

db.accounts.aggregate( 
{ $unwind:"$contacts" },
{ $group: {
     _id: '$_id',
     list: { $push:'$contacts.contactId' }
   }
 }, 
{ $project: { _id: 0, list: 1 }} )

または、マングース フレームワークを使用して、

Account.aggregate(
     { $unwind:"$contacts" },
     { $group: {
          _id: '$_id',
          list: { $push:'$contacts.contactId' }}},
     { $project: { 
          _id: 0, 
          list: 1 }},
     function (err, res) {
          if (err) //handle error;
          console.log(res);
          }
);

集計クエリの最終出力で「_id」フィールドを抑制しようとしたため、すべてのアカウントのすべての contactIds のリストを取得することに本当に関心があり、それらをリンクして戻すことには関心がないと思います。特定のアカウントへ。(元のアカウントごとに 1 つのリストを持つ小さなドキュメントではなく) contactIds の 1 つの長いリストを残したい場合は、代わりに次の集計クエリを実行できます。

db.accounts.aggregate( 
{ $unwind:"$contacts" },
{ $group: {
     _id: "allcontacts",
     list: { $push:'$contacts.contactId' }
   }}
 )

または、マングース フレームワークを使用して、

Account.aggregate(
     { $unwind:"$contacts" },
     { $group: {
          _id: "allcontacts",
          list: { $push:'$contacts.contactId' }}},
     function (err, res) {
          if (err) ;
          console.log(res);
          }
     );
于 2013-09-17T15:35:17.827 に答える