如何通过在第一个位置插入元素来更新数组

时间:2020-02-11 14:18:25

标签: mongodb scala

我想通过在数组的第一个位置添加一个新元素来更新文档。

我实际上在做什么:

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 个答案:

答案 0 :(得分:2)

您是否尝试过“ $ position”运算符?看看https://docs.mongodb.com/manual/reference/operator/update/position/

使用猫鼬是这样的:

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]

来自猫鼬文档

您真的需要将它插入第一个位置吗?也许保留数组顺序是一个好主意,当您获取其值时,您可以按照自己想要的方式进行排序,您对此有何看法?

答案 1 :(得分:0)

我终于找到了解决方案!

这里是:

  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