我有一个类似结构的文档
{
"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/