2011-11-17 1 views
3

나는처럼 보이는 문서가 있습니다. 방문수를 업데이트 (또는 삽입)하고 싶습니다. 여기 내가 지금까지 가지고있는 것이있다. 나는 $ positional operator에 대해 읽었습니다하지만 난 방법이 꺼져 있습니다이 실제로 업데이트하거나 그러나 모든 문서를 삽입 나타나지 않습니다

updObj = {} 
newKeyString = "metaDetails.$.visits" 
updObj[newKeyString] = 1 


Person.update {personName: "Some name}, {$inc: updObj}, {upsert: true}, (err, updRes) -> 

. 어떤 도움이 필요합니까?

편집 : 모델

mongoose = require 'mongoose' 

PersonSchema = new mongoose.Schema 
    personName: 
    type: String, index: true, unique: true 
    metaDetails: [] 

이 내 모델을 추가했습니다. metaDetails은 배열 내에서 의도적으로 정의되지 않습니다. 데이터가 매우 가변적 일 수 있기 때문에

+0

나에게 맞는 것 같습니다. 나는 나의 끝에서 그것을 점검 할 것이고, 위로있는 것을 볼 것이다. – Clint

답변

2

왜 다른 연산자에 $ 연산자를 넣을까요? 자바 스크립트에서는 연관 배열이되지만 $ inc는 이에 상응하는 문자열을 허용합니다.

나는 일반적으로 직접 네이티브 드라이버를 사용할 때 나는 몽구스 구문에 익숙하지 않아요이 기능

Person.update {personName: "Some name"}, {$inc: "metaDetails.$.visits" : 1 }, {upsert: true}, (err, updRes) -> 
+0

''visits'가 지정되지 않았기 때문에 이것은 간단하게 작동하지 않습니다. 위의 편집을 참조하십시오 – Shamoon

+0

@Shamoon, 우리는 단지 당신이 당신의 질문에서 언급 한 것에 기초하여 대답 할 수 있습니다. 당신이 다른 곳에서 실수를 한 것을 어떻게 알 수 있습니까? 단지 방문을 추가 한 후에 당신의 초기 쿼리가 잘 작동하는지 알고 싶습니까? – RameshVel

+0

내 실수. '방문'을 추가 할 수 없습니다. 그건 내 'metaDetails' 슈퍼 변수가 될 수 있기 때문에 문제는 ... 아무것도 – Shamoon

0

을 시도하지만 JS 업데이트는 같아야합니다 :

db.Person.update({"personName": "Some name", "metaDetails.visits": {$exists: true}}, {"$inc": {"metaDetails.$.visits": 1}})

이 비슷한 것일 수 있습니다. 확실하지 않습니다 (괄호가없는 것 같은 느낌입니다) :

Person.update {personName: "Some name", $exists: "metaDetails.visits": true}, {$inc: "metaDetails.$.visits" : 1 }

visits 키가있는 metaDetails 객체가없는 경우 upsert를 true로 설정하면 중복 personName 레코드가 생성됩니다. 간략하게, 업데이트의 $ 연산자는 필드가 술어의 일부가되어야합니다.

관련 문제