首页 > 解决方案 > 如何在 mongoDb 中进行过滤?

问题描述

我有一个收藏品,如下所示

 "role" : [ 
                {
                    "role_id" : "599adabbef17f85afbcee00d",
                    "earn" : {
                        "5943c3f7c74b036a883efaf0" : "E2",
                        "5943c46ec74b036a883efaf1" : "E0",
                        "594a0b08c74b030a2ae33cce" : "E2",
                        "5943c3f7c74b036a883efaf0" : "E5",
                        "5943c46ec74b036a883efaf1" : "E0",
                        "594a0b08c74b030a2ae33cce" : "E4"
                    }
                 }
           ]

我只需要获取没有“E0”的收入值。

 "5943c3f7c74b036a883efaf0" : "E2",
 "594a0b08c74b030a2ae33cce" : "E2",
 "5943c3f7c74b036a883efaf0" : "E5",
 "594a0b08c74b030a2ae33cce" : "E4"

标签: mongodbmongodb-query

解决方案


您可以按如下方式使用聚合查询

db.roles.aggregate([
  {$unwind: "$role" },
  {$project : { earn : { $objectToArray: "$role.earn" }}},
  {$unwind : "$earn" },
  {$match: { "earn.v" : { $ne : "E0" }}},
]);

在以下集合上执行时

> db.roles.find().pretty()
{
        "_id" : ObjectId("5b8d4db5217b959d85f79899"),
        "role" : [
                {
                        "role_id" : "599adabbef17f85afbcee00d",
                        "earn" : {
                                "5943c3f7c74b036a883efaf0" : "E5",
                                "5943c46ec74b036a883efaf1" : "E0",
                                "594a0b08c74b030a2ae33cce" : "E4"
                        }
                }
        ]
}

您将获得以下输出

> db.roles.aggregate([
...   {$unwind: "$role" },
...   {$project : { earn : { $objectToArray: "$role.earn" }}},
...   {$unwind : "$earn" },
...   {$match: { "earn.v" : { $ne : "E0" }}},
... ]);
{ "_id" : ObjectId("5b8d4db5217b959d85f79899"), "earn" : { "k" : "5943c3f7c74b036a883efaf0", "v" : "E5" } }
{ "_id" : ObjectId("5b8d4db5217b959d85f79899"), "earn" : { "k" : "594a0b08c74b030a2ae33cce", "v" : "E4" } }

推荐阅读