मानगो में किसी वस्तु को सहेजने के बाद मुझे ऑब्जेक्ट कैसे मिलेगा?


81
var n = new Chat();
n.name = "chat room";
n.save(function(){
    //console.log(THE OBJECT ID that I just saved);
});

मैं उस ऑब्जेक्ट की ऑब्जेक्ट आईडी को सांत्वना देना चाहता हूं जिसे मैंने अभी सहेजा है। मैं मानगो में कैसे करूं?

जवाबों:


115

यह सिर्फ मेरे लिए काम किया:

var mongoose = require('mongoose'),
      Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/lol', function(err) {
    if (err) { console.log(err) }
});

var ChatSchema = new Schema({
    name: String
});

mongoose.model('Chat', ChatSchema);

var Chat = mongoose.model('Chat');

var n = new Chat();
n.name = "chat room";
n.save(function(err,room) {
   console.log(room.id);
});

$ node test.js
4e3444818cde747f02000001
$

मैं mongoose 1.7.2 पर हूं और यह ठीक काम करता है, बस इसे फिर से सुनिश्चित करने के लिए दौड़ा।


9
एक अपरिभाषित कक्ष वस्तु n को बचाने में त्रुटि का संकेत है। दस्तावेज़ तक पहुँचने से पहले एक त्रुटि जाँच करने के लिए इसका सबसे अच्छा अभ्यास।
क्रिसमकाजावा

3
दोनों n._id और n.id मनचाहे परिणाम के रूप में 3.8.21
क्रिसमेकवा

@ChrisMcJava आपकी टिप्पणी एक जीवन रक्षक थी! जब हम कई लाइनों और कई कार्यों को कोड करते हैं, तो कभी-कभी हमने बाद में त्रुटि को छोड़ दिया, बाद में कभी भी या एलओएल को नहीं भुलाया जा सकता है, धन्यवाद anw!
ksugiarto

किसी ने उत्तर को बाद की तारीख में अधिक स्पष्ट रूप से लिखा था, लेकिन मुझे लगता है कि इस उत्तर में अतिरिक्त बिट अधिक सहायक हो सकता है। उसके लिए मैं इसे एक वोट (लाइन से 8 साल नीचे, कोई कम नहीं) देता हूं।
चीजस टोस्ट

42

मोंगो एक कॉलबैकबॉजेक्ट के रूप में पूरा दस्तावेज भेजता है ताकि आप इसे केवल वहां से प्राप्त कर सकें।

उदाहरण के लिए

n.save(function(err,room){
  var newRoomId = room._id;
  });

10

आप मैन्युअल रूप से _id उत्पन्न कर सकते हैं फिर आपको इसे बाद में वापस खींचने के बारे में चिंता करने की आवश्यकता नहीं है।

var mongoose = require('mongoose');
var myId = mongoose.Types.ObjectId();

// then set it manually when you create your object

_id: myId

// then use the variable wherever

पता करने के लिए बहुत उपयोगी है, जब सिंक्रोनस करेगा अतुल्यकालिक कोड को रोका। धन्यवाद!
नियम

यही मैं मूल रूप से करने जा रहा था, लेकिन मुझे लगता है कि ईमानदार होना अनावश्यक है। हालांकि एक अलग सवाल का जवाब होगा।
चेसस टोस्ट

9

आप डेटाबेस में इसे सहेजे बिना एक नई वस्तु उदाहरण बनाने के बाद सही में Mongoose में ऑब्जेक्ट आईडी प्राप्त कर सकते हैं।

मैं इस कोड काम को मानस 4 में उपयोग कर रहा हूं। आप इसे अन्य संस्करणों में आज़मा सकते हैं।

var n = new Chat();
var _id = n._id;

या

n.save((function (_id) {
  return function () {
    console.log(_id);
    // your save callback code in here
  };
})(n._id));

2

अन्य जवाबों में कॉलबैक जोड़ने का उल्लेख किया गया है, मैं उपयोग करना पसंद करता हूं। ()

n.name = "chat room";
n.save()
.then(chatRoom => console.log(chatRoom._id));

डॉक्स से उदाहरण :।

var gnr = new Band({
  name: "Guns N' Roses",
  members: ['Axl', 'Slash']
});

var promise = gnr.save();
assert.ok(promise instanceof Promise);

promise.then(function (doc) {
  assert.equal(doc.name, "Guns N' Roses");
});

1

साथ saveसब आप सिर्फ क्या करने की जरूरत है:

n.save((err, room) => {
  if (err) return `Error occurred while saving ${err}`;

  const { _id } = room;
  console.log(`New room id: ${_id}`);

  return room;
});

बस अगर कोई सोच रहा है कि उसी परिणाम का उपयोग कैसे किया जाए create:

const array = [{ type: 'jelly bean' }, { type: 'snickers' }];

Candy.create(array, (err, candies) => {
  if (err) // ...

  const [jellybean, snickers] = candies;
  const jellybeadId = jellybean._id;
  const snickersId = snickers._id;
  // ...
});

आधिकारिक डॉक्टर की जाँच करें


1

खैर, मेरे पास यह है:

TryThisSchema.post("save", function(next) {
    console.log(this._id);
});

पहली पंक्ति में "पद" पर ध्यान दें। मानगो के मेरे संस्करण के साथ, डेटा सहेजने के बाद मुझे _id मान प्राप्त करने में कोई परेशानी नहीं है।


0

दरअसल ऑब्जेक्ट को इंस्टेंट करते समय आईडी पहले से ही होनी चाहिए

var n = new Chat();
console.log(n._id) // => 4e7819d26f29f407b0... -> ID is already allocated

इस उत्तर को यहां देखें: https://stackoverflow.com/a/7480248/318380

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.