【发布时间】:2015-09-14 05:41:57
【问题描述】:
示例文档:
{
_id: 42,
foo: {
bar: [1, 2, 3, 3, 4, 5, 5]
}
}
查询:
我想“从foo.bar 中删除所有属于$lt: 4 的条目以及与$eq: 5 匹配的第一个匹配条目”。 重要提示:$eq 部分只能删除单个条目!
我有一个可行的解决方案,它使用 3 个更新查询,但这对于这个简单的任务来说太多了。尽管如此,这就是我到目前为止所做的:
1. 找到与$eq: 5 和$unset 匹配的第一个条目。 (如您所知:$unset 不会删除它。它只是将其设置为null):
update(
{ 'foo.bar': 5 },
{ $unset: { 'foo.bar.$': 1 } }
)
2. $pull所有条目$eq: null,这样以前的5就真的没了:
update(
{},
{ $pull: { 'foo.bar': null } }
)
3. $pull所有条目$lt: 4:
update(
{},
{ $pull: { 'foo.bar': { $lt: 4 } } }
)
结果文件:
{
_id: 42,
foo: {
bar: [4, 5]
}
}
想法和想法:
扩展查询1.,这样它将
$unset条目$lt: 4和一个条目$eq: 5。之后我们可以执行查询 2. 并且不需要查询 3..将查询 2. 扩展到
$pull与$or: [{$lt: 4}, {$eq: 5}]匹配的所有内容。那么就不需要查询3.。将查询 2. 扩展到
$pull的所有$not: { $gte: 4 }。此表达式应匹配$lt: 4和$eq: null。
我已经尝试实现这些查询,但有时它会抱怨查询语法,有时查询确实执行了,但什么也没删除。
如果有人对此有可行的解决方案,那就太好了。
【问题讨论】:
标签: arrays mongodb mongodb-query