7

以下がコレクションに保存されている私のドキュメントであると考えてくださいUsers

{
  _id : "User1",
  joined : ISODate("2011-03-02"),
  likes : {
           sublikes: [
                      {WebsiteID:'001': WebsiteName: 'ABCD'},
                      {WebsiteID:'002': WebsiteName: '2BC2'},
                      {WebsiteID:'003': WebsiteName: '3BC3'},
                      //........... 
                      //........... 
                      {WebsiteID:'999999': WebsiteName: 'SOME_NAME'}
                     ]
          }
}

今mongodb集約フレームワークを使用して、それを取得する必要があります

collection.aggregate([
                        { $project: {
                            _id: 1,
                            "UserID": "$_id", 
                            "WebsiteName": "$likes.sublikes[0]['WebsiteName']"
                        }
                        },
                         { $match: { _id: 'User1'} }
                      ], function (err, doc) {
 ///Not able to get the WebsiteName: 'ABCD'
});

ドキュメントを使用$unwindすると(特に上記の場合)、ドキュメントが大量になるため、配列内の最初のアイテムのみを取得するために巻き戻したくありません(他のアイテムに関係なく)

is にアクセスしてそのフィールドの名前を変更する方法についてのヒントを誰かに教えてもらえますか?


更新1: 私も で投影しようとしました"WebsiteName": "$likes.sublikes.0.WebsiteName"。うまくいきませんでした:-(

更新2: 未解決の問題 - https://jira.mongodb.org/browse/SERVER-4589

今のところ$at動作しません。エラーをスローします:

{ [MongoError: exception: invalid operator '$at']
  name: 'MongoError',
  errmsg: 'exception: invalid operator \'$at\'',
  code: 15999,
  ok: 0 }

それまで使って $unwind

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};
4

1 に答える 1

10

結果を得る最も簡単な方法は、通常の検索クエリと$slice演算子を使用することです。

db.collection.find( {_id: "User1"}, {"likes.sublikes": {$slice: 1}} )

集約フレームワーク (MongoDB 2.4.1 など) は、インデックスの配列をサポートしていません$slice(投票/監視機能の要求: SERVER-6074およびSERVER-4589 )。

$unwind$groupおよび$first演算子を使用して集計フレームワークでこれを行うことができます。

db.collection.aggregate([
    { $match: {
         _id : "User1"
    }},
    { $unwind: "$likes.sublikes" },
    { $group: {
        _id: "$_id",
        like: { $first: "$likes.sublikes" }
    }},
    { $project: {
        _id: 0,
        "UserID": "$_id",
        "WebsiteName": "$like.WebsiteName"
    }}
])

通常$sliceは最もパフォーマンスの高いオプションです。

于 2013-04-11T07:32:23.037 に答える