মঙ্গুয়ের মাধ্যমে আইটেমগুলিকে মঙ্গো অ্যারেতে পুশ করুন


185

আমি উত্তরের জন্য সন্ধান করে বেশ ভালোভাবেই ছড়িয়েছি কিন্তু আমি নিশ্চিত যে আমি পরে যা করছি তা বর্ণনা করার জন্য সঠিক শব্দটির জন্য আমি হারিয়ে ফেলেছি।

মূলত আমার কাছে 'লোক' নামে একটি মংডব সংগ্রহ রয়েছে that সংগ্রহের স্কিমাটি নিম্নরূপ:

people: {
         name: String, 
         friends: [{firstName: String, lastName: String}]
        }

এখন, আমার কাছে একটি খুব প্রাথমিক এক্সপ্রেস অ্যাপ্লিকেশন রয়েছে যা ডাটাবেসের সাথে সংযোগ স্থাপন করে এবং খালি বন্ধুদের অ্যারে দিয়ে সাফল্যের সাথে 'লোক' তৈরি করে।

আবেদনের মাধ্যমিক স্থানে, বন্ধুদের যুক্ত করার জন্য একটি ফর্ম রয়েছে। ফর্মটি প্রথম নাম এবং সর্বশেষ নাম গ্রহণ করে এবং তারপরে নাম ক্ষেত্রের সাথে যথাযথ লোকের বস্তুর রেফারেন্সের জন্য পোস্ট করে।

আমার যেটা করতে খুব কষ্ট হচ্ছে তা হ'ল একটি নতুন ফ্রেন্ড অবজেক্ট তৈরি করা এবং তারপরে এটিকে বন্ধুদের অ্যারেতে "চাপানো"।

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

db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});

আপডেট: সুতরাং, অ্যাড্রিয়ান এর উত্তর খুব সহায়ক ছিল। আমার লক্ষ্যটি সম্পাদনের জন্য আমি যা করেছি তা নিম্নলিখিত।

আমার app.js ফাইলে, আমি ব্যবহার করে একটি অস্থায়ী রুট সেট করেছি

app.get('/addfriend', users.addFriend);

যেখানে আমার ইউজার.জেএস ফাইল আছে

exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}});
};

আমি দেখতে পাচ্ছি যে আমি সম্ভাব্যভাবে সংগ্রহগুলি ব্যবহার করতে পারি Aফাইডঅনঅ্যান্ডআপডেট (), তবে আমি নিশ্চিত নই আমি কোথায় এটি প্রয়োগ করব? আমার মডেল?
নিউরাক্স

উত্তর:


282

ধরে নিয়ে, var friend = { firstName: 'Harry', lastName: 'Potter' };

আপনার কাছে দুটি বিকল্প রয়েছে:

মেমরিটিকে ইন-মেমরি আপডেট করুন এবং সংরক্ষণ করুন (প্লেইন জাভাস্ক্রিপ্ট অ্যারে.পশ):

person.friends.push(friend);
person.save(done);

অথবা

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done
);

আমি সর্বদা চেষ্টা করি এবং যখন সম্ভব হয় তখন প্রথম বিকল্পের জন্য যাই, কারণ এটি মঙ্গুজ আপনাকে যে সুবিধা দেয় (হুকস, বৈধকরণ ইত্যাদি) তার আরও বেশি সম্মান করবে।

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


1
আমি ভেবেছিলাম দ্বিতীয় বিকল্পটি আসলে সমবর্তী লেখার সুরক্ষার ক্ষেত্রে নিরাপদ? আপনি প্রাক্তন বলতে চাইলে আপনি কি ঘটনাক্রমে পরে বলেছেন?
উইল ব্রিকারার

37
হাঁ, আমি শুধু চেক করা এবং (নভেম্বর 2017), এটা IS নিরাপদ নকুল ব্যবহার করতে updateযখন, ফাংশন এটা নয় নিরাপদ , একটি দস্তাবেজটি খুঁজতে মেমরি এটি পরিবর্তন, এবং তারপর কল .save()দস্তাবেজে পদ্ধতি। যখন আমি বলি যে কোনও অপারেশন 'নিরাপদ', এর অর্থ এই যে কোনও নথিতে যদি এক, দুই, বা 50 টি পরিবর্তন প্রয়োগ করা হয় তবে সেগুলি সফলভাবে প্রয়োগ করা হবে এবং আপডেটগুলির আচরণ আপনার প্রত্যাশার মতো হবে। মূলত ইন-মেমরি ম্যানিপুলেশনটি অনিরাপদ কারণ আপনি পুরানো নথিতে কাজ করতে পারেন তাই যখন আপনি সংরক্ষণ করবেন, আনার পদক্ষেপের পরে ঘটে যাওয়া পরিবর্তনগুলি হারিয়ে যাবে।
উইল ব্রিকনার

2
@ উইল ব্রিকনার এর জন্য একটি সাধারণ ওয়ার্কফ্লো হ'ল আপনার যুক্তিটিকে পুনরায় চেষ্টা করার লুপটিতে আবদ্ধ করা: (পুনরায় চেষ্টাযোগ্যতে আনতে হবে, পরিবর্তন করতে হবে, সংরক্ষণ করতে হবে)। যদি আপনি কোনও সংস্করণআরর ফিরে পান (আশাবাদী লক ব্যতিক্রম), আপনি কয়েকবার সেই অপারেশনটি আবার চেষ্টা করতে পারেন এবং প্রতিবার একটি নতুন অনুলিপি পেতে পারেন। আমি এখনও সম্ভব হলে পারমাণবিক আপডেট পছন্দ করি!
অ্যাড্রিয়ান স্নাইডার

8
@ জ্যাকঅফএলট্রেডস আমাকেও বিভ্রান্ত করেছে, তবে আমি বিশ্বাস করি যে কলব্যাক ফাংশনটি হয়েছে। let done = function(err, result) { // this runs after the mongoose operation }
ব্যবহারকারী

কলব্যাকে কীভাবে ফ্রেন্ড অবজেক্টের আইডি পাবেন?
ডি নিক্স

41

$ ধাক্কা অপারেটর একটি অ্যারের করার জন্য একটি নির্দিষ্ট মান appends।

{ $push: { <field1>: <value1>, ... } }

$ পুশ তার উপাদান হিসাবে মান সহ অ্যারের ক্ষেত্র যুক্ত করে।

উপরের উত্তরের সমস্ত প্রয়োজনীয়তা পূরণ হয়, তবে আমি নিম্নলিখিতটি করে এটি কাজ করেছিলাম

var objFriends = { fname:"fname",lname:"lname",surname:"surname" };
Friend.findOneAndUpdate(
   { _id: req.body.id }, 
   { $push: { friends: objFriends  } },
  function (error, success) {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    });
)

এটিই আমি কাজ করতে পেলাম, তাই আমি মনে করি এটি ২০১২ সালের মতো সর্বাধিক আপ টু ডেট I আমার মনে হয় যে সেরা উত্তরটি কোনওভাবেই অভাব বোধ করছে এবং সম্ভবত অসম্পূর্ণ / অসমাপ্ত।
Cheesus টোস্ট

আমি কেবল উল্লেখ করতে পারি যে কোডটিতে আপনার কিছুটা ত্রুটি হতে পারে। আমি এটি কাজ করেছিলাম কারণ আমি আমার প্রকল্পের জন্য সঠিক পরিবর্তনশীল রেখেছি। যেখানে আপনার ফ্রেন্ড.ফাইন্ডঅনঅ্যাপআপেট রয়েছে () আমার কাছে মনে হয় এটি পিপল.ফাইন্ডঅনএন্ডআপডেট () হওয়া উচিত। এটি মূল প্রশ্নের সাথে মিল রেখে আরও হবে। আমি এটি আপনার জন্য সম্পাদনা করতে পারলাম তবে আমি ভুল হওয়ার কারণে আপনি এটি কেবল দ্বিগুণ পরীক্ষা করে দেখতে চাই (আমি নোড / এক্সপ্রেসে কিছুটা নতুন)।
চিজাস টোস্ট

@ চিসাসটোস্ট আমার মনে হয়, আমি যদি ভুল হয় তবে আপনি উত্তরটি পরিবর্তন করতে পারেন। আমি এই উত্তরটি রেখেছি যা আমার পক্ষে কার্যকর ছিল। তবে আপনি যদি এই উত্তরটি ভুল মনে করেন তবে আপনি এই উত্তরটি পরিবর্তন করতে পারেন এবং আপনি আমাকে স্যার :-) সংশোধন করলে আমি খুশি হব।
পার্থ রাওয়াল

1
ঠিক আছে, কোনও সমস্যা নেই, এটি যাইহোক কেবল একটি ছোট সম্পাদনা ছিল। এটি আমার কাছে একপ্রকার নিট-পিক কারণ দর্শকদের (আমার মতো) কাজ করা হত যেখানে অ্যারে যেভাবেই ঠেলে দেওয়া হচ্ছে। আমি এখনও মনে করি এটি সেরা উত্তর হওয়া উচিত :)
চিজাস টোস্ট

9

$pushদস্তাবেজ আপডেট করতে এবং অ্যারের ভিতরে নতুন মান সন্নিবেশ করানোর জন্য ব্যবহার করুন ।

অনুসন্ধান:

db.getCollection('noti').find({})

অনুসন্ধানের ফলাফল:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

হালনাগাদ:

db.getCollection('noti').findOneAndUpdate(
   { _id: ObjectId("5bc061f05a4c0511a9252e88") }, 
   { $push: { 
             graph: {
               "date" : ISODate("2018-10-24T08:55:13.331Z"),
               "count" : 3.0
               }  
           } 
   })

আপডেটের জন্য ফলাফল:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

2

এটি করার একটি সহজ উপায় হ'ল নিম্নলিখিতটি ব্যবহার করা:

var John = people.findOne({name: "John"});
John.friends.push({firstName: "Harry", lastName: "Potter"});
John.save();


-3

আমিও এই ইস্যুতে দৌড়েছি। আমার ফিক্সটি ছিল চাইল্ড স্কিমা তৈরি করা। আপনার মডেলগুলির জন্য উদাহরণের জন্য নীচে দেখুন।

---- ব্যক্তি মডেল

const mongoose = require('mongoose');
const SingleFriend = require('./SingleFriend');
const Schema   = mongoose.Schema;

const productSchema = new Schema({
  friends    : [SingleFriend.schema]
});

module.exports = mongoose.model('Person', personSchema);

*** গুরুত্বপূর্ণ: সিঙ্গেলফ্রেন্ড.স্কেমা -> স্কিমার জন্য ছোট হাতের ব্যবহার নিশ্চিত করুন

--- শিশু স্কিমা

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;

const SingleFriendSchema = new Schema({
  Name: String
});

module.exports = mongoose.model('SingleFriend', SingleFriendSchema);

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