繁体   English   中英

嵌套结构mongodb下如何使用$elemMatch

[英]How to use $elemMatch under nested structure mongodb

我有一个这样的数据集:

{
    "_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 检查对象数组中是否存在值。 如果存在,则编写将增加计数器的更新查询,如果不存在,则将 object 推送到阵列上。

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

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

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

查询是:

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

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

因此,如果 null 出现意味着值不存在,那么我们必须推送 object。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM