web-dev-qa-db-ja.com

MongoDBおよびNodejsを使用した日付の挿入とクエリ

Mongodbとnodejsで日付ごとにレコードを見つけるのに助けが必要です。

次のように、スクレイピングスクリプトのjsonオブジェクトに日付を追加します。

jsonObj.last_updated = new Date();

このオブジェクトはmongodbに挿入されます。次のように表示されます。

 "last_updated" : "2014-01-22T14:56:59.301Z"

次に、nodejsスクリプトでfindOne()を実行します。

 var jObj = JSON.parse(line.toString());

 collection.findOne(jObj,function(err, doc) {
   if (doc){
     console.log(doc._id);
   } else  {
     console.log('not found');
   }
 });

オブジェクトが見つかりません。オブジェクトからlast_updatedフィールドを削除すると、フィールドが検出されるため、間違いなく問題が発生しています。

次のようにフィールドを分離した場合:

collection.findOne({last_updated: '2014-01-22T14:56:59.301Z'},function(err, doc) {
  if (doc){
    console.log(doc._id);
  } else  {
    console.log('not found');
  }
});

何も戻ってきません。何が間違っていますか?

35
jeh

日付文字列ではなく、日付オブジェクトを渡す必要があります。

collection.findOne({last_updated: new Date('2014-01-22T14:56:59.301Z')},function(err, doc) {

MongoDBドライバーはそれをISODateに変換します:

{ 
   "_id" : ObjectId("52dfe0c469631792dba51770"), 
   "last_updated" : ISODate('2014-01-22T14:56:59.301Z') 
}

次の質問を確認してください。

62
Ilan Frumer

明確にするために。知っておくべき重要なことは:

  • はい、Javascript Dateオブジェクトを渡す必要があります。
  • はい、ISODateに対応している必要があります
  • はい、これを機能させる私の経験から、日付をISOに操作する必要があります
  • はい、日付の操作は一般に常に退屈なプロセスであり、mongoも例外ではありません

ここにコードの作業スニペットがあります。Mongoがそれを正しく処理できるようにするために、少しの日付操作を行います。この例では、mongooseモジュールを使用しており、日付属性がmyDateパラメーターとして指定された日付よりも小さい(つまり前の)行の結果が必要です。

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
11
arcseldon

私は最近、同じ問題に遭遇し、いくつかの追加情報を追加したいと思いました。

次の2つの方法で日付を挿入できます。

  1. Nodejsサーバー側で作成(例:ExpressJSスクリプト)

例:新しいオブジェクトを挿入し、タイムスタンプを付けます

_db.collection('mycollection').findOneAndUpdate({'name': req.body.name}, {
  // only "update" if it's an insert, meaning name is not found
  $setOnInsert: {
    'name': req.body.name,
    'date_added': new Date()
  }
}, { 
  upsert: true
}, (err, result) => {
  if(err) return res.send(err);
  res.send(result);
});
_
  1. クライアント側でJSから作成され、REST APIを使用してJSONオブジェクトでPOSTリクエストを介して送信されます

例:

_// Send POST Request here
fetch('addDate', {
  method: 'post',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'date_added':  new Date()
  })
})
_

1.および2.では、上記の回答で説明したように、new Date('2014-01-22T14:56:59.301Z')関数を使用して日付を作成します。違いは、MongoClientパッケージを使用してサーバー側で1.のように実行すると、MongoDBにISODate('2014-01-22T14:56:59.301Z')として保存されることです。クライアント側で2.のように実行すると、MongoDBにString:_'2014-01-22T14:56:59.301Z'_として保存されます。

ISODateオブジェクトを照会するには、new Date('2014-01-22T14:56:59.301Z')またはISODate('2014-01-22T14:56:59.301Z')を使用する必要があります。ストリングを照会するには、ストリングだけを使用します。_'2014-01-22T14:56:59.301Z'_

Mongoシェルを使用したクエリのサンプルを次に示します。

文字列として保存された日付:

_db.mycollection.findOne({date_added {$gte:'2018-06-22T00:07:53.688Z'}})
_

これは戻ります

_{
  "_id" : ObjectId("5b2c3dd90078ce3cd484ef21"),
  "name" : "alfons",
  "date_added" : "2018-06-22T00:07:53.688Z"
}
_

ISODateとして保存される日付:

_db.mycollection.findOne({date_added: {$lte: ISODate('2018-06-26T23:24:37.023Z')}})
_

または、代わりに「新しい日付」を使用します。

_db.mycollection.findOne({date_added: {$lte: new Date('2018-06-26T23:24:37.023Z')}
_

これは返します:

_{
  "_id" : ObjectId("5b2bb21e1954b104e61ff735"),
  "name" : "ceasar",
  "date_added" : ISODate("2018-06-21T14:11:41.323Z")
}
_
4
Renato