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

Mongodb 如何通过在第一个位置插入元素来更新数组,mongodb,scala,Mongodb,Scala,我想通过在数组的第一个位置添加新元素来更新文档 我实际上在做什么: val updateRequest = myCollection.findOneAndUpdate(and(equal("site_id", new ObjectId(siteId)),and(equal("image_name", imageName))), addToSet("url_history", urlHistory)) 结果: { "_id" : ObjectId("5e297ea0c7ede90

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

我实际上在做什么:

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"
        }
    ]
}
所需结果:

{
    "_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"
        }
    ]
}
你试过“$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]
来自猫鼬文件


你真的需要把它插入第一个位置吗?也许保留数组顺序是个好主意,当你获取它的值时,你可以按你想要的方式排序,你怎么看?

我终于找到了一个解决方案

这是:

  val updateRequest = myCollection.findOneAndUpdate(and(equal("site_id", new ObjectId(siteId)),and(equal("image_name", imageName))),
  pushEach("url_history", PushOptions().position(0), urlHistory))
我使用了按钮选项

希望能有帮助

资料来源:

我找到了“$position”操作符,我已经在mongo shell中使用了它,但我不知道如何在scala中使用它。感谢您的建议,但出于一些重要原因,我必须将它放在第一个位置(除其他外,不必遍历整个数组)