4

Javascript、Python、MongoDB を使用して、独自の todo リストを作成しようとしています。タスクの順序を処理する方法に行き詰まっています。

私の現在のアイデアは、各タスク ドキュメントに順序フィールドを設定し、クライアントで順序が変更されたときに、データベースからタスク リストを取得し、各タスクを個別に/順番に並べ替えるというものです。大きな todo リストは大量のクエリを意味するため、これは厄介に思えます。複数のドキュメントのフィールドを順番に更新する方法はありますか?

また、これが最善の方法であるかどうかについてのアドバイスも探しています。todo リストの順序を維持できるようにしたいのですが、間違った方法で行っている可能性があります。

{
  "_id" : ObjectId("50a658f2cace55034c68ce95"),
  "order" : 1,
  "title" : "task1",
  "complete" : 0
}

{
  "_id" : ObjectId("50a658fecace55034c68ce96"),
  "order" : 2,
  "title" : "task2",
  "complete" : 1
}

{
  "_id" : ObjectId("50a65907cace55034c68ce97"),
  "order" : 3,
  "title" : "task3",
  "complete" : 1
}

{
  "_id" : ObjectId("50a65911cace55034c68ce98"),
  "order" : 4,
  "title" : "task4",
  "complete" : 0
}

{
  "_id" : ObjectId("50a65919cace55034c68ce99"),
  "order" : 5,
  "title" : "task5",
  "complete" : 0
}
4

4 に答える 4

2

Mongo はクエリを非常に高速に処理するため、フル機能のリレーショナル データベースを使用している場合ほどパフォーマンスを気にする必要はありません。慎重になりたい場合は、1,000 項目の todo リストを作成して試してみると、すぐに実行できるはずです。

for (var i = 0; i < orderedListOfIds.length; i++)
{
  db.collection.update({ '_id': orderedListOfIds[i] }, { $set: { order:i } })
}

それから

db.collection.find( { } ).sort( { order: 1 } )
于 2012-11-16T17:25:06.233 に答える
0

はい、mongo では複数のドキュメントを更新できます。修飾子操作multi=True. たとえば、これは 5 より大きいorderすべてのドキュメントに対して 1 ずつ増加します。order

todos.update({'order':{'$gt':5}}, {'$inc':{'order':1}}, multi=True)

最善の方法としては、通常、そのためだけに偽のフィールドを作成するよりも、「自然な」順序 (名前、日付、優先度など) を使用することをお勧めします。

于 2012-11-16T16:55:42.343 に答える
0

私は似たようなことをしています。indリスト項目にフィールドを追加しました。リスト項目を新しい場所に移動する方法は次のとおりです。

moveItem: function (sourceIndex, targetIndex) {
    var id = Items.findOne({ind:sourceIndex})._id;
    var movinUp = targetIndex > sourceIndex;
    shift = movinUp ? -1 : 1;
    lowerIndex = Math.min(sourceIndex, targetIndex);
    lowerIndex += movinUp ? 1 : 0;
    upperIndex = Math.max(sourceIndex, targetIndex);
    upperIndex -= movinUp ? 0 : 1;
    console.log("Shifting items from "+lowerIndex+" to "+upperIndex+" by "+shift+".");
    Items.update({ind: {$gte: lowerIndex,$lte: upperIndex}}, {$inc: {ind:shift}},{multi:true});
    Items.update(id, {$set: {ind:targetIndex}});
}
于 2013-04-03T01:59:03.293 に答える