하지만, 이전에 언급 한 바와 같이 $setOnInsert
및 $push
같은 필드에없는 업데이트를 수행 할 때.
주의 : 당신이
Node.js를에서
db.test.update(
{
name : 'Peter'
},
{
$setOnInsert: {name : 'Peter'},
$addToSet: {"visits.en": 'today'} // or $push
},
{upsert: true})
이 배열에서 중복 값을 원하지 않는 경우 우리는 $addToSet
를 사용 : 나는 이런 식으로 일을 오전을하지만 당신은 여전히 쿼리를 사용할 수 있습니다 직접.
내 이유는 잘못된 필드 이름으로 레코드를 업데이트하고 업데이트 쿼리를 구성하지 않기 때문입니다.
먼저 스키마의 인스턴스를 만들어야합니다. 이 스키마 기본적으로 생성 된 _id 속성에 대해 인스턴스를 생성하고 독특한, 그래서 우리는 $setOnInsert
기능 오른쪽 있도록 인스턴스에서 제거해야 할 때
var testSchema = require(./path/testSchema.js); // require your schema
var test = conn.model("test", testSchema, "test"); //conn is the mongoose connection object to the DB
var testToCreate = new test();
testToCreate.name : 'Peter' //add fields to the instance
var testToUpsert = testToCreate.toObject();
delete testToUpsert._id;
delete testToUpsert.visits;
둘째, 우리는하지의 방문 배열을 제거 $setOnInsert
과 함께 $addToSet
(또는 $push
)을 사용할 때 동일한 필드에 영향을주는 2 개의 쿼리가 있습니다.
var options = {
upsert: true
};
test.update({
name : 'Peter'
}, {
$setOnInsert: testToUpsert,
$addToSet: {
"visits.en":'today'
}
},
options,
function(err, testAffected) {
if (err) {
return console.error(err);
}
console.log('testAffected! :', testAffected);
});
Sweet, 나는 기존 필드가 아닌 '$ push'할 수 있다는 것을 몰랐습니다. 이것은 나의 문제를 해결합니다. 내 쿼리를 조금 단순화했기 때문에'$ setOnInsert'를 고수해야합니다. 대신 나는'$ setOnInsert'에서'visit : { 'en': [ 'today'], 'us': []}'를 제거 할 것입니다. – Marius