2012-11-16 5 views
4

Javascript, Python 및 MongoDB를 사용하여 할 일 목록을 직접 만들려고합니다. 나는 작업 순서를 처리하는 방법에 집착하고있다.MongoDB와 함께 할 일 목록에 대한 주문

현재 나의 생각은 각 작업 문서에 주문 필드가 있고 클라이언트에서 주문이 변경되면 db에서 작업 목록을 가져 와서 개별적/순차적으로 각 작업을 다시 정렬합니다. 큰 할일 목록은 많은 양의 질의를 의미하기 때문에 이것은 어색해 보입니다. 여러 문서의 필드를 순차적으로 업데이트하는 방법이 있습니까?

이 방법이 최선의 방법인지 여부에 대한 조언도 찾고 있습니다. 할 일 목록 순서를 유지할 수 있기를 원하지만 잘못된 길로 가고 있습니다.

{ 
    "_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 
} 

답변

2

Mongo는 쿼리가 매우 빠르므로 완전한 기능을 갖춘 관계형 데이터베이스를 사용하는 것처럼 성능에 관심을 가져서는 안됩니다. 신중하고 싶다면 1k 항목의 할 일 목록을 만들고 사용해보십시오. 즉각적이어야합니다.

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

db.collection.find({ }).sort({ order: 1 }) 
0

예, mongo는 여러 문서를 업데이트 할 수 있습니다. modifier operationmulti=True을 사용하면됩니다. 가장 좋은 방법에 관해서는

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

, 보통은 (이름, 날짜 등 우선 순위에 따라) "자연"순서를 사용하는 것이 좋습니다 아니라 예를 들어,이 모든 문서를 하나 order 큰 다섯 이상을 order를 증가 그저 가짜 필드를 만드는 것보다.

+0

을 작업'{ "complete": 0}'그러면 1, 4, 5 순서가 생길 것입니다. 이렇게하면 2, 5, 6 순서가 될까요? 아니면 첫 번째 문서의 순서가 1로 설정되고 다음이 2가 될까요? 삼? –

+0

'$ inc : {x : 1}'은 파이썬에서'x + = 1'과 동일합니다 (x가 존재할 경우). – georg

+0

그래, 각 작업 순서가 1 씩 증가합니다. 클라이언트의 작업 순서에 따라 작업 순서를 다시 지정하고 싶습니다. –

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}}); 
} 
0

당신이 배치에 다음과 같은 작업을 수행 할 수 mongoose.Promise = global.Promise 몽구스의 기본 약속 (ES6)를 사용하는 경우 : 만 잡고 가정

function batchUpdate(res, req, next){ 
    let ids = req.body.ids 
    let items = [] 
    for(let i = 0; i < ids.length; i++) 
    items.push(db.collection.findOneAndUpdate({ _id:ids[i] }, { $set: { order:i } })) 

    Promise.all(items) 
    .then(() => res.status(200).send()) 
    .catch(next) 
} 
관련 문제