2014-11-16 7 views
0

Я запускаю следующее из консоли mongodb (он находится в файле js, который называется через load()), но обратный вызов insert никогда не запускается, хотя все вставки базы данных происходят так, как ожидалось. Может ли кто-нибудь понять, почему?Почему мой обратный вызов вставки не запускается?

db.oldsets.find().forEach(function (set) { 
    var newSet = { 
     tunes: [], 
     keys: [] 
    }; 
    set.tunes.forEach(function (arr) { 
     if (newSet) { 
      var tune = db.oldtunes.findOne({ 
       _id: arr.tune 
      }) 
      var newTune = db.getSiblingDB('jnr_local').tunes.findOne({ 
       sessionId: tune.sessionId 
      }) 
      if (newTune) { 
       newSet.tunes.push(newTune._id); 
       newSet.keys.push(arr.root + tune.mode); 
      } else { 
       newSet = null; 
      } 
     } 
    }) 
    print('out') // outputs for every iteration 
    if (newSet) { 
     db.sets.insert(newSet, function (err, doc) { 
      print('in') // never outputs 
      db.practices.insert({ 
       type: 'set', 
       // srcId: doc[0]._id, 
       stickyness: 0 
      });  
     }); 

    } else { 
     print('else') // never outputs 
     db.dodgySets.insert(set); 
    } 
}); 
+0

Я не думаю, что оболочка манго соответствует node.js api. Это означает, что нет обратных вызовов. http://docs.mongodb.org/v2.2/reference/method/db.collection.insert/#db.collection.insert –

+0

Это лучшее, что я нашел до сих пор http://stackoverflow.com/questions/5789001/ident-last-document-from-mongodb-find-result-set – wheresrhys

ответ

0

Похоже, что вы смешиваете node.js и mongodb shell. В оболочке mongodb весь код синхронный и выполняется по строкам.

Таким образом, db.sets.insert просто вернет вставленный документ.

Итак, попробуйте переписать его следующим образом:

if (newSet) { 
     insertedSet = db.sets.insert(newSet); 
     print('in') // never outputs 
     db.practices.insert({ 
     type: 'set', 
     srcId: insertedSet._id, 
     stickyness: 0 
     });  
} 

Надеется, что это помогает!

+0

Это не означает, что он возвращает объект, в котором указано количество документов. И '.insert()' не добавляет свойство '_id' в newSet. Я прибегал к попыткам асинхронного вещания только после того, как ничего не работало синхронно. – wheresrhys

+0

Но спасибо за то, что указали на nodejs vs shell. Сайты документации не очень хорошо справляются с этим. – wheresrhys

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