【问题标题】:How to use $elemMatch under nested structure mongodb嵌套结构mongodb下如何使用$elemMatch
【发布时间】:2020-09-28 15:10:00
【问题描述】:

我有一个这样的数据集:

{
    "_id" : ObjectId("5ede21062ce68d29740a861a"),
    "a" : {
        "b" : 0,
        "c" : [ 
            {
                "e" : "5c35f1045643180d9488112f",
                "f" : 1,
                "g" : 2
            }
        ],
        "d" : []
    },
},
{
    "_id" : ObjectId("5ede21062ce68d29740a861b"),
    "a" : {
        "b" : 0,
        "c" : [ 
            {
                "e" : "5c35f1045643180d9488112g",
                "f" : 21,
                "g" : 22
            }
        ],
        "d" : []
    },
}

现在我想检查我的 5c35f1045643180d9488112f id 是否存在于 e 列上。因此,如果不存在,那么我会将对象推送到 c 数组上。如果存在那么我将增加 g 的计数器。

我使用了 $elemMatch 方法,但出现错误,即 * 无法在嵌套字段上使用 $elemMatch 投影。*

我正在使用 Mongoose 和 node.js

我的代码是:

db.Collection.findOne(
 {_id: ObjectId('5ede21062ce68d29740a861a')},
 {'a.c': {$elemMatch: {e: '5c35f1045643180d9488112f'}}}
);
it generates the error -> Cannot use $elemMatch projection on a nested field.

然后我尝试了其他方法。在这我没有得到数据,但也没有得到正确的结果。它返回空白数组。

db.Collection.findOne(
 {_id: ObjectId('5ede21062ce68d29740a861a')},
 {'a': {$elemMatch: {c: {$elemMatch: {e: '5c35f1045643180d9488112f'}}}}}
);
//response id --> {_id: ObjectId('5ede21062ce68d29740a861a'), a: { b: 0, c: [], d: [] }}

谁能建议我在哪里做错了。或者什么是实现这一目标的有效且可行的方法。

简单的方法是首先找到数据,然后使用 javascript 检查对象数组中是否存在值。如果存在,则编写将增加计数器的更新查询,如果不存在,则将对象推送到数组中。

但我想通过 DB Query 来实现这一点。任何问题都非常感谢。 提前致谢

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您的第一种方法几乎是正确的。但是有一个syntax 错误。 _id 和其他条件无需使用单独的大括号。

    db.Collection.findOne(
     {_id: ObjectId('5ede21062ce68d29740a861a'),
    'a.c': {$elemMatch: {e: '5c35f1045643180d9488112f'}}}
    );
    

    【讨论】:

    • 我尝试了您的方法,但这两种情况都会返回。即如果 id 不匹配,则仍然返回数据
    • @Aks 当_id 不匹配时,它应该返回null。我刚刚尝试使用您在 mongo 控制台中提供的数据,它对我有用
    【解决方案2】:

    查询是:

    db.Collection.findOne(
     {
      _id: ObjectId('5ede21062ce68d29740a861a'),
      'a.c.e': '5c35f1045643180d9488112f'
     }
    );
    

    因此,如果 Id 存在,则返回 数据。如果不存在则返回 null

    所以如果 null 出现意味着值不存在,所以我们必须推送对象。

    如果值存在,那么我们必须增加计数器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多