gpt4 book ai didi

MongoDB: Embedded Array $elemMatch(projection) 错误问题

转载 作者:可可西里 更新时间:2023-11-01 09:44:16 26 4
gpt4 key购买 nike

> db.test.insert(
{
"seq" : "1",
"a" : [
{
"k1" : "11",
"k2" : "12"
},
{
"k1" : "21",
"k2" : "22"
}
],
"b" : {
"a" : [
{
"k1" : "11",
"k2" : "12"
},
{
"k1" : "21",
"k2" : "22"
}
]
}
}
)

> db.test.find({ "seq" : "1" }, { "a" : { $elemMatch : { "k2" : "22" } }, "a.k2" : 1 }).pretty();
{
"_id" : ObjectId("5407f3c7e40dd5ddb98ab043"),
"a" : [
{
"k2" : "22"
}
]
}

> db.test.find({ "seq" : "1" }, { "b.a" : { $elemMatch : { "k2" : "22" } }, "b.a.k2" : 1 }).pretty();
error: {
"$err" : "Can't canonicalize query: BadValue Cannot use $elemMatch projection on a nested field.",
"code" : 17287
}

请查看以上2.6.3版本的测试结果。我们实际上想要下面的测试结果,但是,收到了一个错误查询。

{
"_id" : ObjectId("5407f3c7e40dd5ddb98ab043"),
"b" : {
"a" : [
{
"k2" : "22"
}
]
}
}

我们希望保留上面的这种结构,希望通过一次查询得到结果。

因此,如果我们找不到其他可用的 One Query,请告知。如果没有,那么我们也想知道您是否愿意在未来提供这个错误查询的解决方案。否则,我们希望有 $elemMatch(projection) 以外的替代方案。

最佳答案

错误说明了一切 - 你不能在 2.6 中以这种方式使用 $elemMatch。您可以通过简单的聚合管道获得本质上是您想要的结果:

> db.test.aggregate([
{ "$match" : { "seq" : "1" } },
{ "$unwind" : "$b.a" },
{ "$match" : { "b.a.k2" : "22" } },
{ "$project" : { "_id" : 1, "b.a.k2" : 1 } }
])
{ "_id" : ObjectId("5409f00ad5a65fc7ef57f67e"), "b" : { "a" : { "k2" : "22" } } }

但我不得不质疑您为什么要寻找这样的结果。您正在搜索带有 seq : "1" 的文档,然后您实际上想在内部搜索数组的特定元素以作为结果返回。这暗示了架构设计问题。也许您想为 b.aa 数组的每个元素创建一个文档,并将 seq 等字段非规范化到每个文档中?我不能自信地说什么,因为您没有详细说明为什么需要看到您所要求的结果。

关于MongoDB: Embedded Array $elemMatch(projection) 错误问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25677743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com