انتقل إلى المحتوى

تحويل JSON إلى بنى Go مع وسوم BSON — Numio

يعيد كتابة مستند JSON على شكل قيمة حرفية (literal) في Go مبنية من bson.M (للكائنات) وbson.A (للمصفوفات) لمشغّل MongoDB في Go، مع الفواصل الختامية التي تتطلبها Go. تحتفظ المفاتيح بترتيبها، وتصبح null هي nil، وتُنسخ السلاسل النصية دون تغيير.

نقل استعلام أو مرشّح MongoDB جرى اختباره في mongosh أو Compass إلى شيفرة Go.

JSON

Go Bson

متى تستخدمها

  • نقل استعلام أو مرشّح MongoDB جرى اختباره في mongosh أو Compass إلى شيفرة Go.
  • كتابة مرحلة تجميع (aggregation) أو مستند تحديث كقيمة حرفية مضمّنة في Go داخل اختبار.

طريقة الاستخدام

  1. الصق الاستعلام أو المرشّح أو المستند بصيغة JSON صارمة (مفاتيح بين علامتي تنصيص، ودون مساعدات shell مثل ObjectId(...) أو ISODate(...)).
  2. انسخ القيمة الحرفية bson.M{...} من لوحة Go؛ تبقى العوامل مثل $gte و$in و$or مفاتيح نصية.
  3. استورد go.mongodb.org/mongo-driver/bson ومرّر القيمة إلى Find أو UpdateOne أو Aggregate، مع تعديل الأنواع كما هو موضح أدناه.

إدخال JSON

{
  "status": "active",
  "deletedAt": null,
  "age": { "$gte": 18 },
  "tags": { "$in": ["go", "mongo"] },
  "$or": [
    { "verified": true },
    { "score": { "$gt": 90 } }
  ]
}

Go bson.M / bson.A

bson.M{
  "status": "active",
  "deletedAt": nil,
  "age": bson.M{
    "$gte": 18,
  },
  "tags": bson.M{
    "$in": bson.A{
      "go",
      "mongo",
    },
  },
  "$or": bson.A{
    bson.M{
      "verified": true,
    },
    bson.M{
      "score": bson.M{
        "$gt": 90,
      },
    },
  },
}

التفاصيل والقيود

يُحلَّل الـ JSON ويُجتاز في متصفحك لبناء القيمة الحرفية؛ ولا يُرسل شيء إلى خادم.

تصبح null هي nil. الأرقام ثوابت Go غير محددة النوع، فيصبح 18 من نوع int و1.5 من نوع float64؛ وتفقد الأعداد الصحيحة الأكبر من 2^53 دقتها عند تحليل الـ JSON.

تُكتب السلاسل النصية كقيم حرفية نصية في Go، لذا تبقى الأقواس المربعة أو المعقوفة داخلها، مثل "tags[0]"، دون مساس.

الناتج هو bson.M، وهو غير مرتّب. استخدم bson.D حيث يهم ترتيب الحقول، كما في مستندات الفرز أو بعض مراحل الـ pipeline.

FAQ

هل يمكنني لصق استعلام mongosh يحتوي ObjectId() أو ISODate()؟

لا. يجب أن يكون الإدخال JSON صالحًا، لذا تسبب مساعدات shell خطأ في التحليل. استخدم سلاسل نصية عادية، ثم استبدلها في Go بـ ObjectID من hex (primitive.ObjectIDFromHex في الإصدار v1 من المشغّل) أو بقيمة time.Time.

هل يُنشئ structs في Go؟

لا، يُنتج قيمًا حرفية من نوع map وslice فقط. للحصول على structs محددة الأنواع مع وسوم json استخدم صفحة JSON to Go.

هل يجب أن يكون الجذر كائنًا؟

لا. تصبح المصفوفة الجذرية bson.A{...}، وهذا يناسب pipeline التجميع حيث تكون كل مرحلة bson.M.

المواصفات والمراجع