【问题标题】:Query with string date format in mongodb在 mongodb 中使用字符串日期格式查询
【发布时间】:2019-11-12 19:49:26
【问题描述】:

我的 mongoDB 集合中有如下数据。我想统计今天的总数或 search_term。

_id:ObjectId("5b7e1d38981cdc1a7c8bb5fc")
search_term:"Baiyoke Boutique"
date:"August 23rd 2018, 9:34:32 am"

_id:ObjectId("5b7e1fa8fa27fd2754080ad9")
search_term:"Baiyoke Boutique"
date:"August 23rd 2018, 9:44:56 am"

_id:ObjectId("5b7e28314d2d0f388c1596cd")
search_term:"Baiyoke Florting Market"
date:"August 23rd 2018, 10:21:21 am"

我尝试了以下查询。我用过时刻。我不是我做的错。

var start = moment().startOf('day');
var end = moment().endOf('day');

history.find({
    date: {
        $gte: start,
        $lt: end
    }
    }).count().toArray(
    function (e, res) {
        if (e) callback(e)
        else callback(null, res)
});

【问题讨论】:

  • 你有什么错误吗?
  • 我得到 history.find(...).count(...).toArray is not a function

标签: node.js mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以在 mongodb 3.6 及更高版本中尝试以下查询

db.collection.find({
  "$expr": {
    "$gte": [{ "$dateFromString": { "dateString": "$date" }}, start.toDate() ],
    "$lt": [{ "$dateFromString": { "dateString": "$date" }}, end.toDate() ]
  }
}).count()

或聚合

db.collection.aggregate([
  { "$addFields": {
    "date": {
      "$dateFromString": {
        "dateString": "$date"
      }
    }
  }},
  { "$match": { "date": { "$gte": start.toDate(), "$lt": end.toDate() }}},
  { "$count": "count" }
])

【讨论】:

  • 嗨@Ashh。你能帮我么。如果我的收藏列有 date="2020-12-13 17:20:00" 并且我想获取大于我当前日期时间的记录,即“2020-12-11 00:00:00”。如何在 find() 中编写 expr?
  • @NaisargParmar 请提出一个新问题,我一定会尽力提供帮助
【解决方案2】:

你可以试试这个

db.col.aggregate([{$addFields: {
      convertedDate: { $toDate: "$date" }
   }},
   {"$match" : 
       {"convertedDate" : 
           {"$gte" : ISODate("2018-08-23T09:34:32.000Z"),
            "$lte" : ISODate("2018-08-23T09:34:32.000Z")}
        }
    },
    {"$group" : {"_id" : null,"count" : {"$sum" : 1}}},
    {"$project" : {"_id" : 0}}
   ])

这是给 Node js 的

var start = moment().startOf('day');
var end = moment().endOf('day');

history.aggregate([{
    $addFields: {
        convertedDate: { $toDate: "$date" }
    }
},
{
    "$match":
    {
        "convertedDate":
        {
            "$gte": start,
            "$lte": end
        }
    }
},
{ "$group": { "_id": null, "count": { "$sum": 1 } } },
{ "$project": { "_id": 0 } }
], function (err, count) {
    console.log(count)
})

【讨论】:

  • 你的mongodb版本是多少?
  • AggregationCursor { pool: null, server: null, disconnectHandler: Store { s: { storedOps: [], storeOptions: [Object], topology: [Object] }, length: [Getter] }, bson:BSON {},ns:'ogin-test.history',cmd:{聚合:'history',管道:[[Object],[Object],[Object],[Object]],光标:{}} , 选项: { readPreference: ReadPreference { mode: 'primary', tags: undefined },
  • 这段代码对我来说运行良好,$toDate 支持 mongo 版本 4+
  • 我的mongodb版本是3.6.4
  • 应该更好var start = moment().startOf('day').toDate();var end = moment().endOf('day').toDate();
【解决方案3】:

试试:

history.count({date: {
    $gte: start,
    $lt: end
}}, function( err, count){
    console.log( "Number of users:", count );
})

用于原生 mongodb 驱动

db.collection(collectionName).count({}, function(error, numOfDocs){
    if(error) return callback(error);
    db.close();
    callback(null, numOfDocs);
});

【讨论】:

  • 结果是 0 .. 根据上面的示例数据集应该给出 3
  • 如何插入日期?字符串还是日期?
  • 以 ISODate 开始和结束 -- {date: { $gte: ISODate(start), $lt: ISODate(end) }
【解决方案4】:

您正在存储日期的字符串表示形式。在存储到数据库之前尝试在时刻对象上调用toDate()

【讨论】:

  • 如果您想保持 JSON a 兼容,则没有必要。您可以通过验证将数据格式化为 ISO8601 来获得使用 EJSON 日期对象的好处。 {"lastAccess": { $gt: "2021-08-01T00:00:00.000Z }}" 会起作用。 OP 正在使用 ObjectID,所以这似乎不是他的目标,所以显然设计有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多