首页 > 解决方案 > MongoDB查询子文档$gt

问题描述

我已经搜索过其他帖子,但似乎工作正常的东西在这里不起作用。我需要你的建议。

这是我的文档在数据库中的样子,只是一个带有一系列标签的文档。

我只需要查询计数器大于 0 的餐厅类型,(因此最终结果将排除计数器 0 的任何类型)

在此处输入图像描述

我的架构

const tagsSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  details: {
    restaurantTypeId: mongoose.Schema.Types.ObjectId,
    restaurantTypes: [{
      _id: mongoose.Schema.Types.ObjectId,
      name: String,
      counter: Number,
    }],
    foodTypeId: mongoose.Schema.Types.ObjectId,
    foodTypes: [{
      _id: mongoose.Schema.Types.ObjectId,
      name: String,
      counter: Number,
    }]
  }
});

我试过了

    tags.find({
    'details.restaurantTypes.counter': {
        $gt: 0
    }
}, (err, data) => {
    if (err) {
        res.send(err);
    }
    res.json(data);
});

我得到了

[
{
    "details": {
        "restaurantTypeId": "5c01fb57497a896d50f49877",
        "restaurantTypes": [
            {
                "_id": "5c01fb57497a896d50f49879",
                "name": "Asian",
                "counter": 1
            },
            {
                "_id": "5c01fb57497a896d50f4987a",
                "name": "Bakery",
                "counter": 0
            },
            {
                "_id": "5c01fb57497a896d50f4987b",
                "name": "Barbecue",
                "counter": 0
            },
            {
                "_id": "5c01fb57497a896d50f4987c",
                "name": "Bars & Pubs",
                "counter": 0
            },
            {
                "_id": "5c01fb57497a896d50f4987d",
                "name": "Bistro",
                "counter": 0
            },

    tags.find({
    'details.restaurantTypes.counter': {
        $gte: 1
    }
}, (err, data) => {
    if (err) {
        res.send(err);
    }
    res.json(data);
});

这给了我相同的结果

标签: mongodb

解决方案


您可以使用聚合管道来过滤 restaurantTypes

  • $match- 过滤餐厅
  • $addFields$filter-按柜台覆盖餐厅类型和餐厅类型

聚合管道

 db.res.aggregate([
        {$match: {"_id" : ObjectId("5c2187be640edfe094a3b946")}},
        {$addFields:{"restaurantTypes" : {$filter : {input : "$restaurantTypes", as : "t", cond : {$ne : ["$$t.counter",0]}}}}}
    ])

推荐阅读