1

これは私の最初の mongodb プロジェクトです。mongodb にこのドキュメント構造があります。特定のユーザー アカウント (各ユーザー アカウントには連絡先の配列があります) を取得しようとしています。このユーザー アカウントから、ID フィールドの配列を取得します。ユーザーの連絡先を取得し、この配列をパラメーターとして別のクエリに渡します。ID フィールドを取得するためにユーザーの連絡先配列をループする必要がないようにするためにこれを行っています。これがドキュメント構造です。私が試したクエリは以下のとおりです。それ

{
  name,
  id,

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

//
  var findByIdAll = function(accountId, callback) {
     var self=this;
          //Get the user account
      Account.findOne({_id:accountId}, function(err,doc) {

          /  After the user account has been obtained, the function below will
        // use an array of the users contactsId's to fetch the contact's accounts
          //please how do I obtain the array of contact Id's before reaching here                     

       self.Account.find({_id:{$in:[/array of contact Ids]}},function(err,results){
      callback(results);
    });
    });
  };

編集 //次のクエリを使用して contactID フィールドの配列を取得できるようになりました

 var r=db.accounts.aggregate({$match:{email:'m@live.com'}},{$unwind:"$contacts"},
       {$project:{_id:0,contacts:1}},{$group:{_id:'$_id',
       list:{$push:'$contacts.accountId'}}});

    The result I get from the query is 

r

{
        "result" : [
                {
                        "_id" : null,
                        "list" : [
                                ObjectId("51c59a31c398c40c22000004"),
                                ObjectId("51c59a31c398c40c22000004")
                        ]
                }
        ],
        "ok" : 1
}
4

1 に答える 1

3

通常の MongoDB クエリでは、常に同じ構造のドキュメント全体が得られます。ドキュメントの一部だけを取得したり、ドキュメントを変換したりしたい場合は、Aggregation Frameworkを使用する必要があります(見た目ほど難しくはないので、試してみてください)。

あなたの場合、連絡先で$unwindを使用して配列を展開し、$matchを使用して必要なアカウントのみを取得し、$projectを使用してデータを必要に応じて表示する必要がある場合があります。

于 2013-06-26T14:21:07.203 に答える