সমস্ত বিদ্যমান ক্ষেত্র অন্তর্ভুক্ত করুন এবং নথিতে নতুন ক্ষেত্র যুক্ত করুন


123

আমি একটি agg প্রকল্পের সমষ্টি পর্যায়টি সংজ্ঞায়িত করতে চাই যেখানে আমি এটিতে নতুন ক্ষেত্র যুক্ত করার নির্দেশ দিতে পারি এবং বিদ্যমান বিদ্যমান ক্ষেত্রগুলির তালিকা না রেখে সমস্ত বিদ্যমান ক্ষেত্রগুলি অন্তর্ভুক্ত করতে পারি।

আমার দস্তাবেজটি অনেক ক্ষেত্র সহ এইরকম দেখাচ্ছে:

{
    obj: {
        obj_field1: "hi",
        obj_field2: "hi2"
    },
    field1: "a",
    field2: "b",
    ...
    field26: "z"
}

আমি এইভাবে একটি সমষ্টি অপারেশন করতে চাই:

[
    {
        $project: {
            custom_field: "$obj.obj_field1",
            //the next part is that I don't want to do
            field1: 1,
            field2: 1,
            ...
            field26: 1
        }
    },
    ... //group, match, and whatever...
]

"সমস্ত ক্ষেত্র অন্তর্ভুক্ত" কীওয়ার্ডের মতো এমন কিছু আছে যা আমি এই ক্ষেত্রে ব্যবহার করতে পারি, বা প্রতিটি ক্ষেত্রকে আলাদাভাবে তালিকাভুক্ত না করার জন্য অন্য কোনও উপায়?


1
এই বৈশিষ্ট্যটি পরবর্তী বড় রিলিজ 2.6 এ আসছে। আপনি এটি অস্থির দেব শাখায় চেষ্টা করতে পারেন - সম্পূর্ণ আগত নথির উল্লেখ করতে "$$ মূল" ব্যবহার করুন। এই টিকিটে বিশদটি দেখুন: jira.mongodb.org/browse/SERVER-5916
Asya

1
এই ইস্যুটি স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 20497499 /… এ উত্থাপিত হয়েছে , আরও কিছু দরকারী এবং বিভিন্ন উত্তর নিয়ে।
ভিন্স বোডরেন

উত্তর:


168

4.2+ এ, আপনি $setএকত্রিত পাইপলাইন অপারেটরটি ব্যবহার করতে পারেন যা $addFields3.4-এ যোগ করার জন্য একটি উপনাম ছাড়া অন্য কিছু নয়

$addFieldsপর্যায় একটি সমতূল্য $projectপর্যায় যে স্পষ্টভাবে ইনপুট দস্তাবেজে সমস্ত বিদ্যমান ক্ষেত্র নির্দিষ্ট করে এবং নতুন ক্ষেত্র যোগ করা হয়েছে।

db.collection.aggregate([
    { "$addFields": { "custom_field": "$obj.obj_field1" } }
])

2
সি # ড্রাইভারে এটি কীভাবে ব্যবহার করবেন কোনও ধারণা? মনে হচ্ছে এটির অস্তিত্ব নেই
হোমাম

আমি সি # ড্রাইভারের সাথে পরিচিত নই তবে $addFieldsমঙ্গোডিবি 3.4 এ নতুন যা সি # ড্রাইভার সংস্করণ 2.5+
স্টাইভেন

আমি সি # ড্রাইভারের মধ্যে এটি করার জন্য একটি উপায় অনুসন্ধান করেছি এবং এখনও পর্যন্ত দেখে মনে হচ্ছে এটি করার IAggregateFluent<TResult>.AppendStage(new JsonPipelineStageDefinition<TInput, TOutput>("{ $addFields : { myField: 'myValue' }}")
উপায়টি এর

4
আমি আবিষ্কার করেছি যে এটি একই ক্ষেত্রটিকে প্রতিস্থাপন করতে পারে যদি আপনি একই ক্ষেত্রের নাম উল্লেখ করেন
CME64

79

আপনি মূল ডকুমেন্টটি উল্লেখ করতে $$ মূল ব্যবহার করতে পারেন । এই দস্তাবেজের সমস্ত ক্ষেত্রকে একটি ক্ষেত্রে রাখুন এবং এটির পরে পাওয়ার চেষ্টা করুন (আপনার ক্লায়েন্ট সিস্টেমের উপর নির্ভর করে: জাভা, সি ++, ...)

 [
    {
        $project: {
            custom_field: "$obj.obj_field1",
            document: "$$ROOT"

        }
    },
    ... //group, match, and whatever...
]

17
কিন্তু এই একটি এমবেডেড ডক নামক তৈরি করবে documentনির্মিত এক করার জন্য একটি বিকল্প মার্জ সুন্দর ডক হত ...
আলেকজান্ডার Suraphel

2
এমবেডড ডকুমেন্টটি তৈরি না করে কী কী কী কী সমস্ত মূল জোড়ায় পাস করার সমাধানটি জানেন?
ugotchi

11
নিঃশ্বাস ধরে রাখুন. মঙ্গোডিবি 3.4 আসবে $ অ্যাডফিল্ডস সমষ্টি পর্যায় যা এটি কেবল এটি করে। স্ট্যাকওভারফ্লো . com/a/24557029/4653485 দেখুন ।
জেরুমে

এটি সেরা বর্তমান সমাধান বলে মনে হচ্ছে, যেমন আপনি করতে পারেন (কমপক্ষে জেএসে) তারপরে স্প্রেড অপারেটরটি নতুন custom_fieldসংযুক্ত করে আপনার মূল বস্তুকে পুনর্নির্মাণ করতে ব্যবহার করতে পারেন । const newObj = { ...result.document, custom_field: result.custom_field }
ffritz

7

>>> "সমস্ত ক্ষেত্র অন্তর্ভুক্ত" এমন কীওয়ার্ড রয়েছে যা আমি এই ক্ষেত্রে বা অন্য কোনও সমাধান ব্যবহার করতে পারি?

দুর্ভাগ্যক্রমে, একীকরণ অপারেশনে "সমস্ত ক্ষেত্র অন্তর্ভুক্ত" করার জন্য কোনও অপারেটর নেই। একমাত্র কারণ, কেননা সংগ্রহের ক্ষেত্রগুলি (যোগফল, গড় ইত্যাদি) থেকে ডেটা গ্রুপ / গণনা করার জন্য এবং সংগ্রহের সমস্ত ক্ষেত্রের প্রত্যক্ষ প্রত্যক্ষ উদ্দেশ্য নয় because


... কারণ সংগ্রহের ক্ষেত্রগুলি থেকে ডেটাগুলি গোষ্ঠী / গণনা করার জন্যই সমষ্টি তৈরি করা হয়েছে ... সর্বোত্তম উত্তর!
felipsmartins

1
posts_id, শিরোনাম, বডি, পছন্দ ক্ষেত্র সহ আপনার সংগ্রহ রয়েছে। পছন্দগুলি ক্ষেত্রটি ব্যবহারকারী _ আইডির একটি অ্যারে যারা পোস্টটি পছন্দ করে। আপনি সমস্ত _id, শিরোনাম, বডি, লাইক কাউন্ট সহ সমস্ত পোস্ট কীভাবে তালিকাভুক্ত করতে পারেন? এই ক্ষেত্রে সমস্ত ক্ষেত্র ফিরিয়ে দেওয়া প্রত্যক্ষ উদ্দেশ্য।
doc_id

3

সংস্করণ ২.6.৪ অনুসারে, $projectএকত্রিত পাইপলাইনের জন্য মঙ্গো ডিবিতে এমন বৈশিষ্ট্য নেই । এর জন্য দস্তাবেজগুলি থেকে $project:

পাইপলাইনে কেবলমাত্র নির্দিষ্ট ক্ষেত্রগুলি সহ নথির পাশ দিয়ে পরবর্তী পর্যায়ে যায় to নির্দিষ্ট ক্ষেত্রগুলি ইনপুট ডকুমেন্টস বা নতুন গনিত ক্ষেত্রগুলি থেকে বিদ্যমান ক্ষেত্র হতে পারে।

এবং

_Id ক্ষেত্রটি আউটপুট নথিতে অন্তর্ভুক্ত থাকে default আউটপুট নথিতে ইনপুট ডকুমেন্টগুলি থেকে অন্যান্য ক্ষেত্রগুলি অন্তর্ভুক্ত করতে আপনাকে অবশ্যই স্পষ্টভাবে ly প্রকল্পের অন্তর্ভুক্তি নির্দিষ্ট করতে হবে।


2

আপনার দস্তাবেজে নতুন ক্ষেত্র যুক্ত করতে আপনি ব্যবহার করতে পারেন $addFields

ডক্স থেকে

এবং আপনার দস্তাবেজের সমস্ত ক্ষেত্রে, আপনি ব্যবহার করতে পারেন $$ROOT

db.collection.aggregate([

{ "$addFields": { "custom_field": "$obj.obj_field1" } },
{ "$group": {
        _id : "$field1",
        data: { $push : "$$ROOT" }
    }}
])

0

@ ডেকা জবাব অনুসারে, সি # মংডোব ড্রাইভার 2.5 এর জন্য আপনি নীচের মতো সমস্ত কী সহ দলবদ্ধ নথিটি পেতে পারেন;

var group = new BsonDocument
{
 { "_id", "$groupField" },
 { "_document", new BsonDocument { { "$first", "$$ROOT" } } }
};

ProjectionDefinition<BsonDocument> projection = new BsonDocument{{ "document", "$_document"}};
var result = await col.Aggregate().Group(group).Project(projection).ToListAsync();

// For demo first record 
var fistItemAsT = BsonSerializer.Deserialize<T>(result.ToArray()[0]["document"].AsBsonDocument);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.