मेरे पास इस तरह के दस्तावेजों के साथ एक संग्रह है:

db.collection.findOne(
{
   "Info": {
      "Type": [
        {
          "sour": "text",
          "det": "MOCKUP",
          "date": "2020-04-01T00:03:00"
        },
        {
          "sour": "text",
          "det": "MOCKUP",
          "date": "2020-05-02T00:03:00"
        },
        {
          "sour": "verbal",
          "det": "MOCKUP2",
          "date": "2017-12-01T00:03:01"
        },
        {
          "sour": "Verbal",
          "det": "MOCKUP2",
          "date": "2020-04-01T00:02:01"
        },
        {
          "sour": "other",
          "det": "MOCKUP3",
          "date": "2020-05-03T00:00:01"
        }
    ]}
})

मैं संग्रह में प्रत्येक दस्तावेज़ के लिए विशिष्ट det प्राप्त करना चाहता हूं (सिर्फ फ़ील्ड sour == "text" या "verbal" के लिए। for sour == "other" नहीं। उदाहरण:

{ "_id" : ObjectId("6200af876ffa4589f3f50e222"), "numbers" : [ "MOCKUP", "MOCKUP2" ] }
.
.
{ "_id" : ObjectId("4500af876ffa4589f3f50e455"), "numbers" : [ "MOCKUP3"] }

क्या यह एकल एकत्रीकरण पाइपलाइन के साथ करना संभव है?

0
joskaldas 18 फरवरी 2021, 19:52

2 जवाब

सबसे बढ़िया उत्तर

यह वह प्रश्न है जिसे मैं ढूंढ रहा था:

db.collection.aggregate([
  {$unwind:  "$Info.Type" },
  {$match:  { $or: [ { "Info.Type.sour": "text" }, { "Info.Type.sour": "verbal" } ] } },
  {$group: { _id :  "$_id", numbers: { $addToSet: "$Info.Type.det" } } }
])
0
joskaldas 23 फरवरी 2021, 20:01

MongoDB में डेटा

rs0:PRIMARY> db.col.find().pretty()
{
    "_id" : ObjectId("602eacca94c171385d557a83"),
    "Info" : {
        "Type" : [
            {
                "sour" : "text",
                "det" : "mock-text-1",
                "date" : "2020-04-01T00:03:00"
            },
            {
                "sour" : "text",
                "det" : "mock-text-2",
                "date" : "2020-05-02T00:03:00"
            },
            {
                "sour" : "verbal",
                "det" : "mock-verbal-1",
                "date" : "2017-12-01T00:03:01"
            },
            {
                "sour" : "verbal",
                "det" : "mock-verbal-2",
                "date" : "2020-04-01T00:02:01"
            },
            {
                "sour" : "other",
                "det" : "mock-other-1",
                "date" : "2020-05-03T00:00:01"
            }
        ]
    }
}

एकत्रीकरण समारोह

db.col.aggregate([
  {$unwind:  "$Info.Type" },
  {$match:  { $or: [ { "Info.Type.sour": "text" }, { "Info.Type.sour": "verbal" } ] } },
  {$group: { _id :  "$Info.Type.sour", numbers: { $addToSet: "$Info.Type.det" } } }
]).pretty()

नमूना निष्पादन

rs0:PRIMARY> db.col.aggregate([
...   {$unwind:  "$Info.Type" },
...   {$match:  { $or: [ { "Info.Type.sour": "text" }, { "Info.Type.sour": "verbal" } ] } },
...   {$group: { _id :  "$Info.Type.sour", numbers: { $addToSet: "$Info.Type.det" } } }
... ]).pretty()


{ "_id" : "text", "numbers" : [ "mock-text-1", "mock-text-2" ] }
{ "_id" : "verbal", "numbers" : [ "mock-verbal-2", "mock-verbal-1" ] }
0
Ali Can 18 फरवरी 2021, 21:11