2012-11-26 8 views
6

私はMongoDBで新しく、私は集約で作業しようとしています。私は部分的に私が探していることをやっているが、私は日付と奇妙な動作があります。

MongoDBの情報

バージョン:2.2.0

オペレーティングシステム:Windows 7

目的

は後方に作成したすべてのコメントを取得しますER '2012年11月22日'

のは、例を取得してみましょう:

データ

db.blogs.save([ { 
    title : "X this is my second title", 
    author : "max", 
    posted : new Date(), 
    pageViews : 10, 
    tags : [ "good", "nice" ], 
    comments : [ { 
     "_id" : ObjectId("50ac9fdb53a900bcb4be46d9"), 
     author : "john", 
     text : "pretty awesome", 
     create : ISODate("2012-12-20T00:00:00.000Z") 
    }, { 
     "_id" : ObjectId("50ac9fd003a900bcb4be46d9"), 
     author : "sam", 
     text : "this is bad", 
     create : ISODate("2012-12-22T00:00:00.000Z") 
    } ], 
    other : { 
     foo : 5 
    } 
}, { 
    title : "X this is my title", 
    author : "bob", 
    posted : new Date(), 
    pageViews : 5, 
    tags : [ "fun", "good", "fun" ], 
    comments : [ { 
     "_id" : ObjectId("50ac55db53a900bcb4be46d9"), 
     author : "matthieu", 
     text : "bof bof", 
     create : ISODate("2012-12-21T00:00:00.000Z") 
    }, { 
     "_id" : ObjectId("50ac55db53a900bcb4b226d9"), 
     author : "sam", 
     text : "this s bad", 
     create : ISODate("2012-12-22T00:00:00.000Z") 
    } ], 
    other : { 
     foo : 6 
    } 
}, { 
    title : "X NEW ELEMENT", 
    author : "emil", 
    posted : new Date(), 
    pageViews : 33, 
    tags : [ "bad", "hehe", "cool", "nice" ], 
    comments : [ { 
     "_id" : ObjectId("50ac55db531100bcb4b226d9"), 
     author : "emilie", 
     text : "could be better", 
     create : ISODate("2012-12-21T00:00:00.000Z") 
    }, { 
     "_id" : ObjectId("50ac55db101100bcb4b226d9"), 
     author : "samuel", 
     text : "maybe a good one", 
     create : ISODate("2012-12-20T00:00:00.000Z") 
    } ], 
    other : { 
     foo : 9 
    } 
}, { 
    title : "X Y NEW ELEMENT", 
    author : "marc", 
    posted : new Date(), 
    pageViews : 33, 
    tags : [ "bad", "hehe", "cool", "nice" ], 
    comments : [ { 
     "_id" : ObjectId("50ac55db101100bcb4baa6d9"), 
     author : "sam", 
     text : "hehe", 
     create : ISODate("2012-11-20T00:00:00.000Z") 
    }, { 
     "_id" : ObjectId("50ac55db101ab0bcb4baa6d9"), 
     author : "daniel", 
     text : "yeehhhh hoho", 
     create : ISODate("2012-11-23T00:00:00.000Z") 
    } ], 
    other : { 
     foo : 9 
    } 
} ]) 

例1:

リターンにマッチする文字列でOKユーザー 'sam'のすべての「コメント」:

db.blogs.aggregate([ 
    { $unwind: "$comments" }, 
    { $match: { 'comments.author' : "sam" } }, 
    { $group: { _id: "$comments" } } 
]) 

これは、プロパティ 'author'が 'sam'の場合のコメントです。


例2:日付付きの問題?

この凝集は(私にとって)前回と同じではなく、「作者」をマッチングのですが、私は日付のプロパティに一致する「を作成」:

db.blogs.aggregate([ 
    { $unwind: "$comments" }, 
    { $match: { 
    'comments.create' : { 
     $gt: ISODate("2012-11-22T00:00:00Z") 
    } 
    } }, 
    { $group: { _id: "$comments" } } 
]) 

しかし、あなたは、この凝集をテストする場合は、あなたをコメントに「2012-11-22」よりも「作成日」の日付が含まれていることがわかります。たとえば、ID「50ac9fdb53a900bcb4be46d9」のコメントが返されます。


私は「2012年11月22日」より大きい日付を持つ唯一のコメントが...私は私が何かを逃したと思い期待...

は私の神、あなたに

+6

IDコード「50ac9fdb53a900bcb4be46d9」のコメントは、あなたのサンプルコードに基づいて、11月ではなく12月に日付があります: 'create:ISODate(" 2012-12-20T00:00:00.000Z ")'。つまり、すべてが設計どおりに動作しているように見えます;-)。 – Stennie

+1

ところで、 '' $ comments ''をグループ化することはおそらくあなたがここでやりたいことではありません。パイプラインで['$ project'](http://docs.mongodb.org/manual/reference/aggregation/project/#_S_project)操作を使用して、代わりに結果に含まれる内容を制御してみてください。 – JohnnyHK

答えて

4

ホーありがとうございました!ステニはそうです。

db.blogs.aggregate([ 
    { $project : { 'comments' : 1 } }, 
    { $unwind: "$comments" }, 
    { 
     $match: { 
      'comments.create' : { 
       $gt: ISODate("2012-12-21T00:00:00Z") 
      } 
     } 
    } 
]) 
:JohnnyHKはそれが操作をこのように行うには多分良いでしょうと述べたように、それは、

私はそれが...働いて2012-12-21T00:00:00Zを置けば^^ところで

... 11月はなく12月です

$groupを使用しないで、$projectを使用すると、私が探しているものが得られるようです。

ご協力いただきありがとうございます。

関連する問題