【发布时间】: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 来实现这一点。任何问题都非常感谢。 提前致谢
【问题讨论】: