Как обновить массив, вставив элемент в первую позицию - PullRequest
1 голос
/ 11 февраля 2020

Я хочу обновить документ, добавив новый элемент на первой позиции в массиве.

Что я на самом деле делаю:

val updateRequest = myCollection.findOneAndUpdate(and(equal("site_id", new ObjectId(siteId)),and(equal("image_name", imageName))),
    addToSet("url_history", urlHistory))

Результат :

{
    "_id" : ObjectId("5e297ea0c7ede90a7ae7586e"),
    "image_name" : "test.jpg",
    "url_history" : [ 
        {
            "date" : ISODate("2020-02-08T10:43:47.127Z"),
            "url" : "No image url"
        },
        {
            "date" : ISODate("2020-02-11T10:43:47.127Z"),
            "url" : "test.jpg"
        }
    ]
}

Желаемый результат:

{
    "_id" : ObjectId("5e297ea0c7ede90a7ae7586e"),
    "image_name" : "test.jpg",
    "url_history" : [ 
        {
            "date" : ISODate("2020-02-11T10:43:47.127Z"),
            "url" : "test.jpg"  
        },
        {
            "date" : ISODate("2020-02-08T10:43:47.127Z"),
            "url" : "No image url"
        }
    ]
}

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вы пробовали оператор "$ position"? Взгляните https://docs.mongodb.com/manual/reference/operator/update/position/

Использование mon goose будет выглядеть так:

const schema = Schema({ nums: [Number] });
const Model = mongoose.model('Test', schema);

const doc = await Model.create({ nums: [3, 4] });
doc.nums.push(5); // Add 5 to the end of the array
await doc.save();

// You can also pass an object with `$each` as the
// first parameter to use MongoDB's `$position`
doc.nums.push({
  $each: [1, 2],
  $position: 0
});
doc.nums; // [1, 2, 3, 4, 5]

из mon goose документы

И вам действительно нужно вставить его в первую позицию? Может быть, это хорошая идея для сохранения порядка массива, и когда вы выбираете его значения, вы можете просто упорядочить его по своему желанию, что вы об этом думаете?

0 голосов
/ 12 февраля 2020

Я наконец нашел решение!

Вот оно:

  val updateRequest = myCollection.findOneAndUpdate(and(equal("site_id", new ObjectId(siteId)),and(equal("image_name", imageName))),
  pushEach("url_history", PushOptions().position(0), urlHistory))

Я использовал PushOptions .

Надеюсь, это поможет.

Источник: https://mongodb.github.io/mongo-scala-driver/2.6/scaladoc/org/mongodb/scala/model/Updates $. html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...