2014-06-07 4 views
1

문서에 저장된 배열 밖으로 요소를 가져와 검색하려고합니다. POPed 요소를 반환하지 않기 때문에 $ pop을 사용할 수 없습니다. 대신 findAndModify()를 사용하려고합니다. 그것은 셸 콘솔에서 작동하지만 mongodb node.js 드라이버 (https://www.npmjs.org/package/mongodb)를 사용하여 문제가 발생합니다.Node.js 드라이버 "mongodb"findAndModify() 구현 - 필드를 지정하는 방법?

내 문서 구조는 그래서 다음과 같습니다 몽고 쉘에서

{ _id: '1', queue: [1,2,3]} 

, 내가 할 :

> db.collection.findAndModify({ query: { _id: 1 }, 
           update: { $pop: { queue: -1 } }, 
           fields: { queue: { $slice: 1 } }, new: false }) 

$ 슬라이스가 돌아 문서는 단지 poped 된 요소를 보여줍니다 보장합니다. 명확히하기 위해, 나는 큐에있는 것에 관심이 없다. 단지 내가 큐에서 방금 튀어 나온 것에 관심이있다.

반환 :

< {_id: 1, "queue": [1]} // yes, it works! 

MongoDB의 라이브러리를 사용하여, 나는이 $ 슬라이스 지정하는 방법을 모르는 : 1, 옵션에서 지원하지 않는 것 (?) :

> db.collection('collection').findAndModify(
     { _id: 1 }, 
     [], 
     { $pop: { queue: -1 }, queue: { $slice: 1 } }, 
     { new: false }, 
     function(error, results) { 
      if(error) { 
       console.log(error); 
      } 
      console.log(results); 
     } 
); 

반환 : 기본적으로

< MongoError: exception: Field name duplication not allowed with modifiers 

- 나는 "큐 : {$ 슬라이스 : 1}"넣어해야 nodejs에 참여는 할 쿼리 이 일? node.js 드라이버 구현에서도 지원됩니까?

또한 findAndModify()는이 방법으로 사용하기위한 것 같지 않습니다. $ pop이 POPed 값을 반환하면 이상적입니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?

감사합니다, - 사미르

답변

0

IT는 Node.js를 구현 전혀 '필드'연산자를 지원하지 않는 것 같다.

우리는 약이 일을 알아 냈어요 :

1) 우리는 대신 같은 문서 내에서 배열로, 그 자체가 문서의 각 요소를 저장합니다. https://blog.serverdensity.com/queueing-mongodb-using-mongodb/ http://www.slideshare.net/mongodb/mongodb-as-message-queue

: 우리를 도와하고 유사한 문제가있을 경우 도움이 될

db.collection('collection').findAndModify(
     {}, // findAndModify will match it to the first document, if multiple docs are found 
     [], 
     {}, 
     {remove: true, new: false }, // returns & removes document from collection 
     function(error, results) { 
      if(error) { 
       console.log(error); 
      } 
      console.log(results); 
     } 
); 

좋은 링크 :

2) 이제 findAndModify 지금처럼 작동

관련 문제