2016-05-16 2 views
2

Node.JS, MONGODB, не используется Mongoose.MongoDB Upserts Имя переменной в качестве ключа (Node.JS)

У меня есть документ, который я сохраняю. Когда я использую UPSERT, она структурирует данные, как так:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), 
     "document" : 
       [ {"name" : "SomeName" } ] 
} 

При использовании INSERT вставляет все это на уровне корня:

{ "_id" : ObjectId("573a123f55e195b227e7a78d"), "name" : "SomeName" } 

Это, очевидно, будет приводить к большому количеству несоответствий. Я пробовал разные вещи. Я пробовал различные методы, такие как findOneAndReplace, Update with Upsert, я попытался заменить, $ setOnInsert. Все это делает то же самое, что и Upsert.

Я пытался использовать документ [0] для доступа первого блока массива, но выдает ошибку ... Неожиданный токен [ '

Я пробовал различные методы и закопал в течение нескольких часов через различную документацию, и искали высокого и низкого для кого-то другого, имеющего эту проблему, но, похоже, это не хорошо документированная проблема для кого-либо еще.

У кого-нибудь есть рекомендации, чтобы убедиться, что все поля находятся на уровне ROOT, а не вложены под именем переменной? Соответствующий код ниже.

findReplace: function(db, document, collection) { 

    var dbCollection = db.collection(collection); 

    var filter = document.name; 

    return new Promise(function(resolve, reject) { 
     dbCollection.updateOne({ 
      "name" : filter 
     }, { 
      document 
     }, { 
      upsert: true 
     }, function(err, result) { 
      if (err) { 
       console.log('error', err) 
       reject(err); 
      } 
      console.log("Found Document and Upserted replacement Document"); 
      resolve([{'status' : 'success'}]); 
     }); 
    }); 
} 

ответ

1

Когда вы сделаете это:

{ 
    document 
} 

Вы создаете объект, содержащий document свойство и значение переменной в качестве значения:

{ 
    document: [ {"name" : "SomeName" } ] 
} 

This is new functionality from ES6. Если вы хотите получить доступ к первому элементу переменной документа, не создавайте новый объект:

return new Promise(function(resolve, reject) { 
    dbCollection.updateOne({ 
     "name" : filter 
    }, document[0], { // <======== 
     upsert: true 
    }, function(err, result) { 
     if (err) { 
      console.log('error', err) 
      reject(err); 
     } 
     console.log("Found Document and Upserted replacement Document"); 
     resolve([{'status' : 'success'}]); 
    }); 
}); 
+0

Отлично, спасибо! Я старался идти в ногу с изменениями ES6, но всегда что-то новое. Это всегда мелочи. – FouMedia

Смежные вопросы