মঙ্গুজ ব্যবহার করে একটি মঙ্গোডিবি নথি থেকে একটি কী মুছুন


105

আমি নোড.জেএস দিয়ে মোঙ্গোডিবি অ্যাক্সেসের জন্য মঙ্গুজ লাইব্রেরিটি ব্যবহার করছি

কোনও দস্তাবেজ থেকে কী সরিয়ে দেওয়ার কোনও উপায় আছে ? অর্থাত্ মানটিকে নালায় সেট করবেন না, তবে এটি সরিয়ে দেবেন?

User.findOne({}, function(err, user){
  //correctly sets the key to null... but it's still present in the document
  user.key_to_delete = null;

  // doesn't seem to have any effect
  delete user.key_to_delete;

  user.save();
});

4
আমি ভেবেছিলাম আমি এটি খুঁজে পেয়েছি তবে কিছু পরীক্ষার পরে: সম্ভবত তা হয়নি। যদিও বিষয়টি নিয়ে কিছুটা ভাল আলোচনা হয়েছে। গ্রুপ.google.com/group/mongoose-orm/browse_thread/thread/…
স্টিফেন

এলওএল কিছু যায় আসে না, আমার ধারণা এটি আপনার পোস্ট!
স্টিফেন

উত্তর:


172

প্রারম্ভিক সংস্করণগুলিতে আপনাকে নোড-মংডোব-নেটিভ ড্রাইভারটি নামিয়ে ফেলতে হবে। প্রতিটি মডেলের একটি সংগ্রহ অবজেক্ট থাকে যা নোড-মোংডব-নেটিভ অফারগুলিতে সমস্ত পদ্ধতি ধারণ করে। সুতরাং আপনি এটি দ্বারা প্রশ্নে ক্রিয়াটি করতে পারেন:

User.collection.update({_id: user._id}, {$unset: {field: 1 }});

সংস্করণ ২.০ থেকে আপনি এটি করতে পারেন:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);

সংস্করণ ২.৪ থেকে, আপনার কাছে যদি ইতিমধ্যে কোনও মডেলের উদাহরণ থাকে তবে আপনি এটি করতে পারেন:

doc.field = undefined;
doc.save(callback);

এটি মঙ্গুজ ২. এক্স এ স্থির করা হয়েছে, যাতে আপনি সংগ্রহটি বাইরে রেখে যেতে পারেন।
staackuser2

4
হয় ব্যবহার করুন User.update({ _id: id }, { $unset: { field: 1 }}, callback)বা যদি আপনার কোনও নথির উদাহরণ থাকে তবে doc.field = undefined; doc.save()
অপরিজ্ঞাত

25
কেবল একটি নোট যে আপনি যদি কোনও পুরানো সম্পত্তি অপসারণের চেষ্টা করছেন যা আপনার স্কিমায় আর কোনও সংজ্ঞায়িত করা উচিত নাdoc.set('field', undefined)
অজানা

4
মুছে ফেলা সম্পর্কে কি doc.field.foo?
chovy

28
doc.set('field', undefined)কড়া মোড (ডিফল্ট) স্কিমাতে নেই এমন ক্ষেত্রগুলি সেট করার অনুমতি দেয় না বলে @ বিভ্যাসিলিরি যথেষ্ট না হতে পারে। doc.set('field', undefined, { strict: false })ভাল কাজ করেছে।
আলেকজান্ডার লিংক


30

আমি মঙ্গুজ ব্যবহার করি এবং উপরের যে কোনও ফাংশন ব্যবহার করে আমার প্রয়োজনীয়তা পূর্ণ হয়। ফাংশনটি ত্রুটি মুক্ত কম্পাইল করে তবে ক্ষেত্রটি এখনও থাকবে।

user.set('key_to_delete', undefined, {strict: false} );

আমার জন্য কৌশলটি।


এই দরকারী উত্তর, খুব খারাপ @ আলেকজান্ডার-লিঙ্ক Upvoting এতে 2015 (একটি উত্তর ফিরে না stackoverflow.com/questions/4486926/... )
w00t

4
আপনার জবাবের জন্য আপনাকে ধন্যবাদ, আমার জন্য, অন্যান্য সমাধানগুলি অ্যারেগুলিতে নেস্টেড বস্তুর জন্য কাজ করে না!
বেনসওয়ার

@ বেনসওয়ার এটি আমার ক্ষেত্রেও ছিল। কেবলমাত্র এই সমাধানটিই ভালভাবে কাজ করেছিল কারণ নির্দিষ্ট নথির আইডিটি খুঁজে পাওয়ার পরে আমাকে অ্যারের সাথে একটি ক্ষেত্র মুছতে হয়েছিল
লুইস ফেব্রো

নোট করুন যে স্ট্রিংটি মূল পথে চলার পথে। সুতরাং, আপনি যে বস্তুটি মুছতে চান তা যদি নেস্ট করা থাকে তবে আপনাকে অবশ্যই এটির দিকে পাথর করতে হবে। এই উত্তরটি আমার সমস্যার সমাধান!
ব্র্যাডিয়ো

8

মোঙ্গো সিনট্যাক্সে নিম্নলিখিত কীগুলি আপনার প্রয়োজন এমন কিছু কী মুছে ফেলার জন্য:

{ $unset : { field : 1} }

মঙ্গুজেও একই রকম মনে হচ্ছে।

সম্পাদনা করুন

এই উদাহরণটি পরীক্ষা করুন ।


আপনি কি এই উত্তরটি স্পষ্ট করতে এবং একটি কোড উদাহরণ দিতে পারেন যা উপরের উদাহরণ কোডের সাথে সম্পর্কিত?
ড্যানিয়েল বিয়ার্ডসলে

দুঃখিত তবে আমি মঙ্গুজে প্রকাশিত নই। সিনট্যাক্সের উপরে এটি মঙ্গো সিনট্যাক্স, সুতরাং আমি মনে করি যে কোনও ভাষার জন্য ড্রাইভারটি এটি সমর্থন করে। আমি কিছু উদাহরণ পেয়েছি, আমার উত্তরে এটি পরীক্ষা করে দেখুন।
অ্যান্ড্রু ওরিচ

1

এটি ব্যবহার করার মতো কোনও সমস্যা হতে পারে

function (user)

পরিবর্তে

function(err, user)

সন্ধানের কলব্যাকের জন্য? আমার ইতিমধ্যে কেসটি ছিল তাই এটির সাথে সাহায্য করার চেষ্টা করছি।


1

মঙ্গুজ ডকুমেন্টটি কোনও সরল জাভাস্ক্রিপ্ট অবজেক্ট নয় এবং এজন্য আপনি মুছুন অপারেটরটি ব্যবহার করতে পারবেন না ((বা unset 'লোডাশ' লাইব্রেরি থেকে)।

আপনার বিকল্পগুলি ডক.পথ = নাল || মংগস ডকটিকে সরল বস্তুতে পরিণত করতে এবং সেখান থেকে যথারীতি ব্যবহার করুন ডকুমেন্ট.টোঅবজেক্ট () পদ্ধতিটি অপরিবর্তিত বা ব্যবহার করুন। মঙ্গুজ এপি-রেফ-এ আরও পড়ুন: http://mongoosejs.com/docs/api.html# ডকুমেন্ট_ডোকমেন্ট- টো অবজেক্ট

উদাহরণটি এরকম কিছু দেখতে পাবে:

User.findById(id, function(err, user) {
    if (err) return next(err);
    let userObject = user.toObject();
    // userObject is plain object
});


0

এই সমস্ত উত্তরগুলির সাথে সমস্যা হ'ল তারা একটি ক্ষেত্রের জন্য কাজ করে। উদাহরণস্বরূপ বলা যাক যে আমি আমার ডকুমেন্ট থেকে সমস্ত ক্ষেত্র মুছতে চাই যদি সেগুলি খালি স্ট্রিং হয় ""। প্রথমে আপনার ক্ষেত্রটি খালি স্ট্রিং এ দেওয়া আছে কিনা তা পরীক্ষা করা উচিত $unset:

function unsetEmptyFields(updateData) {
  const $unset = {};
  Object.keys(updatedData).forEach((key) => {
    if (!updatedData[key]) {
      $unset[key] = 1;
      delete updatedData[key];
    }
  });
  updatedData.$unset = $unset;

  if (isEmpty(updatedData.$unset)) { delete updatedData.$unset; }

  return updatedData;
}

function updateUserModel(data){
const updatedData = UnsetEmptyFiled(data);

    const Id = "";
    User.findOneAndUpdate(
      { _id: Id },
      updatedData, { new: true },
    );
}


0

আপনি যদি সংগ্রহ থেকে কোনও কী মুছে ফেলতে চান তবে এই পদ্ধতিটি ব্যবহার করে দেখুন। এটি আমার জন্য কাজ করেছে

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);

0

আমি আমার দস্তাবেজ থেকে 'কভার' নামক একটি ক্ষেত্র সরানোর চেষ্টা করছি তবে এটি টাইপ বাফার। সুতরাং কোনও কারণে আমি এটিকে অপরিজ্ঞাত করে তুললেও তা এখনও বাইনারি টাইপ থেকে যায় আমাকে অপরিজ্ঞাত ফলাফল দেওয়ার সময় এই রুটটি ডকুমেন্টের সাথে মিলিত প্রোফাইল সম্পত্তি থেকে কভার ক্ষেত্রটি ফেরত দেয়

`

exports.update = (req, res) => {
  let form = new formidable.IncomingForm();
  form.keepExtension = true;
  form.parse(req, (err, fields, files) => {
    if (err) {
      return res.status(400).json({
        error: "Photo could not be uploaded",
      });
    }
    let user = req.profile;
    user = _.extend(user, fields);

    if (fields.password && fields.password.length < 6) {
      return res.status(400).json({
        error: "Password should be min 6 characters long",
      });
    }
    if (fields.cover == null) {
      user.cover = undefined;
    }

    if (files.photo) {
      if (files.photo.size > 10000000) {
        return res.status(400).json({
          error: "Image should be less than 1mb",
        });
      }
      sharp(files.photo.path)
        .resize(300, 300, {
          fit: "cover",
        })
        .jpeg({
          quality: 90,
        })
        .toFile(`assets/users/${user.profile}.jpg`, (err, info) => {
          if (err) {
            return res.status(400).json({
              error: "unable to process the image",
            });
          }
        });
    }
    if (files.cover) {
      if (files.cover.size > 10000000) {
        return res.status(400).json({
          error: "Image should be less than 1mb",
        });
      }
      sharp(files.cover.path)
        .resize(1200, 675, {
          fit: "cover",
        })
        .jpeg({
          quality: 90,
        })
        .toBuffer((err, compressed, info) => {
          User.findOneAndUpdate(
            { profile: user.profile },
            { cover: compressed }
          )
            .select("_id")
            .exec((err, updatedUser) => {
              if (err)
                res.status(400).json({
                  error: "Unable to process the image",
                });
            });
        });
    }

    console.log("user", user);

    user.save((err, result) => {
      if (err) {
        return res.status(400).json({
          error: errorHandler(err),
        });
      }
      user.hashed_password = undefined;
      user.salt = undefined;
      user.photo = undefined;
      res.json(user);
      console.log("result", result);
    });
  });
};

`


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.