MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Сравнете 2 дати в метода за намиране на mongo

За MongoDB 3.6 и по-нови:

$expr оператор позволява използването на изрази за агрегиране в рамките на езика на заявката, като по този начин можете да използвате използването на $dateToString оператор за преобразуване на полето за дата:

db.test.find({ 
    "$expr": { 
        "$ne": [ 
             { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
             { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
        ] 
    } 
})

или използване на рамка за агрегиране с $ съвпадение тръбопровод

db.test.aggregate([
    { "$match": { 
        "$expr": { 
            "$ne": [ 
                { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
            ] 
        } 
    } }
])

За MongoDB 3.0+:

Можете също да използвате рамката за агрегиране с $redact оператор на конвейер, който ви позволява да обработвате логическото условие с $cond оператор и използва специалните операции $$ ЗАПАЗИ за да „запазите“ документа, където логическото условие е вярно или $$PRUNE за да "премахнете" документа, където условието е невярно.

Помислете за изпълнение на следната обобщена операция, която демонстрира горната концепция:

db.test.aggregate([
    {
        "$redact": {
            "$cond": [
                { 
                    "$ne": [ 
                        { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                        { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
                    ] 
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Тази операция е подобна на наличието на $project конвейер, който избира полетата в колекцията и създава ново поле, което съдържа резултата от заявката за логическо условие и след това последващо $match , освен че $redact използва един етап на конвейер, който е по-ефективен:

db.test.aggregate([
    {
        "$project": { 
            "created": 1, 
            "last_active": 1,
            "sameDay": { 
                "$cond": [ 
                    { 
                        "$eq": [ 
                            {"$substr" : ["$last_active",0, 10]}, 
                            {"$substr" : ["$created",0, 10]}
                        ] 
                    }, true, false 
                ]
            } 
        } 
    },
    { "$match": { "sameDay": false } }
])

0r

db.test.aggregate([
    {
        "$project": { 
            "created": 1, 
            "last_active": 1,
            "sameDay": { 
                "$cond": [ 
                    { 
                        "$eq": [ 
                            { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                            { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
                        ] 
                    }, true, false 
                ]
            } 
        } 
    },
    { "$match": { "sameDay": false } }
])

Друг подход би бил да използвате $where оператор във вашия find() метод, но имайте предвид, че заявката ще бъде доста бавна, тъй като използвате $където само изисква сканиране на таблица и базата данни изпълнява JavaScript израза или функцията за всеки документ в колекцията, така че комбинирайте с индексирани заявки, ако можете, тъй като производителността на заявката също се подобрява, когато я изразявате с помощта на стандартните MongoDB оператори (напр. $gt , $in ):

db.test.find({ 
   "$where": function() { 
       return this.created.getDate() !== this.last_active.getDate() 
   } 
});

или по-компактен:

db.test.find({ "$where": "this.created.getDate() !== this.last_active.getDate()" });

С въвеждането:

/* 0 */
{
    "_id" : 1,
    "created" : ISODate("2014-12-19T06:01:17.171Z"),
    "last_active" : ISODate("2014-12-21T15:38:13.842Z")
}

/* 1 */
{
    "_id" : 2,
    "created" : ISODate("2015-07-06T12:17:32.084Z"),
    "last_active" : ISODate("2015-07-06T18:07:08.145Z")
}

/* 2 */
{
    "_id" : 3,
    "created" : ISODate("2015-07-06T06:01:17.171Z"),
    "last_active" : ISODate("2015-07-07T10:04:30.921Z")
}

/* 3 */
{
    "_id" : 4,
    "created" : ISODate("2015-07-06T06:01:17.171Z"),
    "last_active" : ISODate("2015-07-06T09:47:44.186Z")
}

/* 4 */
{
    "_id" : 5,
    "created" : ISODate("2013-12-19T06:01:17.171Z"),
    "last_active" : ISODate("2014-01-20T13:21:37.427Z")
}

Агрегацията връща:

/* 0 */
{
    "result" : [ 
        {
            "_id" : 1,
            "created" : ISODate("2014-12-19T06:01:17.171Z"),
            "last_active" : ISODate("2014-12-21T15:38:13.842Z"),
            "sameDay" : false
        }, 
        {
            "_id" : 3,
            "created" : ISODate("2015-07-06T06:01:17.171Z"),
            "last_active" : ISODate("2015-07-07T10:04:30.921Z"),
            "sameDay" : false
        }, 
        {
            "_id" : 5,
            "created" : ISODate("2013-12-19T06:01:17.171Z"),
            "last_active" : ISODate("2014-01-20T13:21:37.427Z"),
            "sameDay" : false
        }
    ],
    "ok" : 1
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да проверя $setDifference в два масива с помощта на mongo-query

  2. Персонализирано валидиране на Mongoose за парола

  3. Колекция в колекция

  4. Грешка при препълване на паметта при използване на обобщени и $group заявки

  5. Защо моите MongooseJS ObjectIds се провалят на теста за равенство?