2012-05-03 19 views
4

我有一个名为col有看起来像这样的删除与数组字段的大小小于3个文件在MongoDB中

{ 
    { 
    intField:123, 
    strField:'hi', 
    arrField:[1,2,3] 
    }, 

    { 
    intField:12, 
    strField:'hello', 
    arrField:[1,2,3,4] 
    }, 

    { 
    intField:125, 
    strField:'hell', 
    arrField:[1] 
    } 
} 

现在我想从收集col在阵列的其中size删除文档的文档的MongoDB集合场不到2

所以我写了一个查询,看起来像这样

db.col.remove({'arrField':{"$size":{"$lt":2}}}) 

现在这查询不做任何事情。我检查了db.col.find(),它返回所有文件。这个查询有什么问题?

回答

5

从文档$size

不能使用$大小找到各种尺寸(例如:数组有超过1元)。

该文档建议保持一个单独的大小字段(所以在这种情况下,arrFieldSize)与数组中的项目的数量,如果你想尝试这样的事情。

4

请注意,对于某些查询,仅使用(n)或条件列出所有需要进入或排除的计数可能是可行的。

在你的榜样,下面的查询将给出所有文件与少于2数组项:

db.col.find({ 
    "$or": [ 
    { "arrField": {"$exists" => false} }, 
    { "arrField": {"$size" => 1} }, 
    { "arrField": {"$size" => 0} } 
    ] 
}) 
+0

但正如接受的答案所说,你不能范围查询$大小,所以这将无法正常工作。 – UpTheCreek

+1

这绝对有效。这不是本地范围查询,它只是您感兴趣的所有$ size值的普通旧ORing。不要说“给我所有带有arrField $ size 0-2的文档”,你可以要求“所有带有arrField $ size 0,arrField $ size 1或者arrField $ size 2的文档”。显然这只有在您感兴趣的$ size值的范围很小时才可行,但在这些情况下,它工作得非常好,并且可能比添加arrFieldSize计数器或类似工具更方便。 –

+0

对不起 - 我的错。如果您进行编辑,我可以删除我之前给出答案的downvote。 – UpTheCreek

3

用MongoDB的2.2+,您可以使用数字索引在条件对象键来做到这一点:

db.col.remove({'arrField.2': {$exists: 0}}) 

这将删除任何在arrField中没有至少3个元素的文档。