私はMongoDBが初めてで、集計を操作しようとしています。私は探していることを部分的に行っていますが、日付に関して奇妙な動作をしています。
MongoDB 情報
バージョン: 2.2.0
オペレーティング システム: Windows 7
目的
「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」より後の日付のコメントのみが期待されます...何かを見逃したと思います...
ありがとうございました