首页 > 解决方案 > Mongoose find() 所有 json 对象

问题描述

下面的代码有效并且能够找到第一个 JSON 对象的所有参数

   public async getAllFeaturesByFlagParams(searchFeature: SearchFeatureDto): Promise<FeatureDto[]> {
    return this.searchFeatureModel
      .find({ flags: { $elemMatch: searchFeature.flags[0] } })
      .then((features) => {
        return features.map((flagDocument) => {
          const featureDto = new FeatureDto();
          featureDto.mapFromSchema(flagDocument);
          return featureDto;
        });
      })
  }

但是,我希望能够搜索flags而不仅仅是flags[0]. 并能够返回所有searchFeature匹配的东西flags,我一直在为此苦苦挣扎。我怎样才能使这项工作?

但是我怎样才能.find()使用数组呢?

flags 只是一个 JSON 文档

flags {
featureFlagId :"124"
name :"exampleName"
}

示例 mongoose 文档返回:

对于Features

[
    {
        "flags": [
            {
                "featureFlagId": "124",
                "name": "exampleName"
            }
        ],
        "name": "exampleFeature1",
    },
    {
        "flags": [
            {
                "featureFlagId": "123",
                "name": "exampleName"
            }
        ],
        "name": "exampleFeature2",
    }
]

标签: mongoose

解决方案


考虑到您有类似以下数据的内容searchFeature.flags

searchFeature.flags = [
  { featureFlagId: "1", name: "flagName" },
  { featureFlagId: "2", name: "flagName" }
];

你需要准备数组$and操作,

var searchFlags = searchFeature.flags.map(function(f){
   return { flags: { $elemMatch: f } };
});

上面的代码将导致searchFlags

[
 { flags: { $elemMatch: { featureFlagId: "1", name: "flagName" } } },
 { flags: { $elemMatch: { featureFlagId: "2", name: "flagName" } } }
]

$and如果要匹配所有标志,请检查条件,

.find({ $and: searchFlags })

$or如果要匹配任何单个标志,请检查条件,

.find({ $or: searchFlags })

操场


推荐阅读