MongoDB - 在另一个字段上使用$ nin

时间:2015-02-25 15:53:05

标签: mongodb

我正在使用MongoDB 2.6.7,我正在尝试运行以下查询

Categories.find({'_id': { $nin: ancestors }})

其中Categories集合与MongoDB文档手册(具有祖先数组的模型树结构)中使用的完全相同。例如:

db.categories.insert( { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )

但是我没有得到任何结果,所以我想知道是否有可能获得Categories集合中所有未包含在任何文档的祖先数组字段中的文档...换言之,没有子项的类别类别。

1 个答案:

答案 0 :(得分:1)

您基本上需要ancestors集合中categories内所有类别的集合。如果您有此列表,则可以运行简单查询:

> var ancestors = [ "Books", "Programming", "Databases" ];
> db.categories.find({ "_id" : { "$nin" : ancestors }});

如果您没有设置ancestors,那么您可以使用聚合来获取它。

> db.categories.aggregate([
    { "$unwind": "$ancestors" },
    { "$group":
        {
            "_id": null,
            "ancestors": { "$addToSet": "$ancestors" }
        }
    }
]);
{ "_id" : null, "ancestors" : [ "Databases", "Programming", "Books" ] }

您也可以使用distinct()获取此数组。

> db.categories.distinct("ancestors");
[ "Books", "Databases", "Programming" ]

然后,您可以运行原始查询。