mongodb - $addToSet 更新后 mongodb 中的切片数组

标签 mongodb mongodb-query

我有一个类似结构的文档

{
    "brand": "BMW",
    "models": ["320","545"]
}

模型必须是唯一的,我在添加新项目时使用以下查询,

db.cars.update(
    {brand:'BMW'},
    {
        $addToSet: {
            models: '750'
        }
    },
    {upsert:true}
);

这会给

{
    "brand": "BMW",
    "models": ["320","545","750"]
}

问题:

如何限制“模型”可以拥有的项目总数?假设我只想保留最后 3 个添加的模型。因此,如果我插入一个新模型“135”,我最终会得到

{
    "brand": "BMW",
    "models": ["545","750","135"]
}

我读到了 $slice修饰符,但它似乎仅在使用 $push 而不是 $addToSet

时可用

最佳答案

有趣的问题,因为这实际上是 bug 的主题已经提出一个实际的request添加。至于请求,我不会屏住呼吸添加此行为。

错误在于您实际上可以发出以下命令:

db.cars.update(
    {brand:'BMW'},
    { $addToSet: { models: { $each: ['200'], $slice: 3 } } },
    {upsert: true}
)

和 addToSet 会在忽略修饰符或警告的情况下工作。但当然,您现在的数组中有四个元素。

来自 CTO 的评论指出了术语上的冲突。

因此,我唯一能想到的就是首先使用 $elemMatch 测试数组中的元素。在查找中,如果文档都存在并且 $elemMatch 查找不正确,则使用常规 $push 和切片进行更新。否则插入新文档或不理会它

db.cars.update(
   {brand:'BMW'},
   {$push: { models: { $each: ['750'], $slice: -3 } }}
)

这将导致在网络上再进行两次操作。交替拉下文档并自己操作数组,这将是另外一项操作。无论哪种方式,您都会失去 upsert 的魔力,而必须手动执行操作。

关于mongodb - $addToSet 更新后 mongodb 中的切片数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21466297/

相关文章:

mongodb - Mongo 多级聚合组

node.js - 如何为 MongoDB 集合中的文档选择单个字段?

javascript - 不知道如何消除 MongoDB 中的重复键错误

java - Spring Data MongoRepository save(T) 不工作......有时

python - 在引用字段列表上使用 only() 进行 Mongoengine 查询

node.js - mongoose findById 在我使用字符串文字时有效,但在引用对象的属性时无效

MongoDB:数据分区上的磁盘I/O利用率已消失

javascript - 对子文档数组进行 elemMatch 搜索

mongodb查询嵌套结构

java - 根据条件从 mongo 集合中获取一些数据