2010-08-31 12 views

Odpowiedz

24

Ludzie z #mongodb byli pomocni. Interfejs API JS obecnie nie obsługuje tego, ale możesz użyć własnego identyfikatora. Aby wygenerować "normalny" identyfikator, wykonaj _id: new ObjectId(). Więc przykład w moim pytaniem byłoby:

id = new ObjectId(); 
obj = {a: 1, b: 2, _id: id}; 
db.foo.insert(obj); 
+4

Dziękuję, że wróciłeś, aby odpowiedzieć na własne pytanie. Bardzo doceniane! –

+0

w moim szczególnym przypadku przy użyciu node-mongodb-native było to 'message._id = new mongodb.ObjectID()' – slf

0

Teraz Mongo rodzimy JS API obsługuje to. Można uzyskać ostatni id tak:

collection.insert(line, {w : 1}, function(err, inserted) { 
    inserted[0]._id 
} 

insert ustawia właściwość _id na wstawionego obiektu, ale wygląda na to trzeba czekać na obiekt, aby powrócić. Najlepszym dokumentacja Znalazłem za to (niestety) w kodzie źródłowym:

https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js

+0

nie jest teraz bezpieczny przestarzały? czy nie powinniśmy używać 'journal' lub' w'? – slf

+0

Czy możesz przejść do dokumentacji, w której możemy to sprawdzić? Co dokładnie mówisz, że insert modyfikuje linię, aby dodać _id? Czy linia jest przekazywana do callbacka? –

+0

Zapomniałeś drugiego argumentu funkcji wywołania zwrotnego, zobacz [api docs] (https://github.com/mongodb/node-mongodb-native#insert). –

0

Jeśli wstawić dane tak:

var temptodo = new User({ 
     title: data.todo.text, 
     email: socket.handshake.email, 
     created_at: Date.now(), 
     completed: false, 
     sid: socket.handshake.sid 
    }); 
    temptodo.save(function(error, User){ 

      console.log("this is the id for the new todo. "+User._id); 
      console.log('Todo saved in database with sid: '+socket.handshake.sid); 
    }); 

Następnie można chwycić _id takiego : console.log ("to jest identyfikator nowego todo." + User._id);

1

Jeśli prowadzisz

db.collection("venues").insert({name: "test3", FSid: "test3"}, function(err, ret) { 
    console.log(ret) 
}) 

zwraca

{ result: { ok: 1, n: 1 }, 
    ops: [ { name: 'test3', FSid: 'test3', _id: 57cb0a1162cecfe636df6fc1 } ], 
    insertedCount: 1, 
    insertedIds: [ 57cb0a1162cecfe636df6fc1 ] } 

Więc można dostać w swoje identyfikatory wraz ze wszystkimi wstawionych obiektów poprzez:

ret.ops[0]._id 

lub prosto

ret.insertedIds[0] 
Powiązane problemy