6

私は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」より後の日付のコメントのみが期待されます...何かを見逃したと思います...

ありがとうございました

4

1 に答える 1

7

なんてこった!ステニーは正しいです。12月じゃなくて11月だ…

私が置くなら、2012-12-21T00:00:00Zそれは働いています... ^^

ところで、JohnnyHKが言ったように、この方法で操作を行う方が良いかもしれません:

db.blogs.aggregate( [
    { $project : { 'comments' : 1 } },
    { $unwind: "$comments" },
    { 
       $match: { 
          'comments.create' : {
                $gt: ISODate("2012-12-21T00:00:00Z")
          }
       } 
    }
])

使わなくて$groupも使っ$projectて欲しいものが手に入ったようです。

フィードバックをお寄せいただきありがとうございます。

于 2012-11-26T15:43:10.290 に答える