[英]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.