0

I am learning MongoDB (5.6) and have a collection with documents like this:

[
  {
    "_id": {
      "$oid": "62642b53df03395a48eba4d3"
    },
    "title": "Chemical Biology",
    "authors": [
      "625861411edf9d62ec72c889"
    ],
    "year": 1947,
    "sentences": [
      "sentence 001",
      "sentence 002"
    ]
  }
]

I want to update the array "sentences" to an array of objects (in all the documents of the collection) using the existing value. I expect it like this:

[
  {
    "_id": {
      "$oid": "62642b53df03395a48eba4d3"
    },
    "title": "Chemical Biology",
    "authors": [
      "625861411edf9d62ec72c889"
    ],
    "year": 1947,
    "sentences": [
      {
        "order_chem": 50,
        "order_bio": 50,
        "order_science": 50,
        "order_school": 50,
        "value": "sentence 001"
      },
      {
        "order_chem": 50,
        "order_bio": 50,
        "order_science": 50,
        "order_school": 50,
        "value": "sentence 002"
      }
    ],
  }
]

So far this query is the nearest thing I have achieved:

db.collection.update({},
[
  {
    "$set": {
      "sentences": {
        "value": {"$arrayElemAt": ["$sentences", 0]},
        //"value": "$sentences",
        "order_chem": 50,
        "order_bio": 50,
        "order_science": 50,
        "order_school": 50
      }
    }
  }
],
{
  multi: true
})

Which of course is producing nearly what I want, but not exactly (since I hard quoted the index to 0). If I could gain access to the current index/value of the array sentences in each loop, I can get the desired result.

[
  {
    "_id": ObjectId("62642b53df03395a48eba4d3"),
    "authors": [
      "625861411edf9d62ec72c889"
    ],
    "sentences": [
      {
        "order_chem": 50,
        "order_bio": 50,
        "order_science": 50,
        "order_school": 50,
        "value": "sentence 001",
      },
      {
        "order_chem": 50,
        "order_bio": 50,
        "order_science": 50,
        "order_school": 50,
        "value": "sentence 001"
      }
    ],
    "title": "Chemical Biology",
    "year": 1947
  }
]

Mongo Playground

How can I access the exact numeric array index or element/content in each loop?

Thanks for your patience to read this far. Can you please advice how to use the current/existing value of a numerical array field and convert the same field to an object array using the current value?

Thanks in advance.

1 Answer 1

1

As you are working update with aggregation pipeline, you can use $map to iterate elements in sentences and return new sentences array.

db.collection.update({},
[
  {
    "$set": {
      "sentences": {
        $map: {
          input: "$sentences",
          in: {
            "order_chem": 50,
            "order_bio": 50,
            "order_science": 50,
            "order_school": 50,
            value: "$$this"
          }
        }
      }
    }
  }
],
{
  multi: true
})

Sample Mongo Playground

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.