使用另一个字段的值查找MongoDB对象
最近,我发现很难找到存储在文档中的对象,该对象的键位于同一文档的另一个字段中使用另一个字段的值查找MongoDB对象,mongodb,mongoose,mongodb-query,nosql,Mongodb,Mongoose,Mongodb Query,Nosql,最近,我发现很难找到存储在文档中的对象,该对象的键位于同一文档的另一个字段中 { list : { "red" : 397n8, "blue" : j3847, "pink" : 8nc48, "green" : 983c4, }, result : [ { "id" : 397n8, value : "anger" }, { "id" : j3
{
list : {
"red" : 397n8,
"blue" : j3847,
"pink" : 8nc48,
"green" : 983c4,
},
result : [
{ "id" : 397n8, value : "anger" },
{ "id" : j3847, value : "water" },
{ "id" : 8nc48, value : "girl" },
{ "id" : 983c4, value : "evil" }
]
}
}
我正在尝试获取'blue'的值,它的id为'j3847',值为'water'
db.docs.find( { result.id : list.blue }, { result.value : 1 } );
# list.blue would return water
# list.pink would return girl
# list.green would return evil
我尝试了很多东西,甚至找到了一篇关于如何使用同一文档中的值更新值的好文章;没有成功…:/
如何使用另一个字段的值来查找MongoDB对象?一种方法是使用运算符,但不建议使用它,因为它会调用完整的集合扫描,而不管其他什么条件可能会使用索引选择,并且还会在每个结果文档上调用JavaScript解释器,这将比本机代码慢得多
也就是说,使用替代方法进行此类比较,这肯定是更好的选择:
db.docs.aggregate([
{“$REWIND”:“$result”},
{
“$project”:{
"结果":一,,
“相同”:{“$eq”:[“$list.blue”,“$result.id”]}
}
},
{“$match”:{“same”:true},
{
“$project”:{
“_id”:0,
“值”:“$result.value”
}
}
])
当运算符应用于结果
数组字段时,它将为应用展开的结果字段的每个元素生成新记录。它基本上将数据展平,然后在随后的步骤中检查数组的每个成员,以比较这两个字段是否相同
样本输出
{
"result" : [
{
"value" : "water"
}
],
"ok" : 1
}
{
"result" : [
{
"_id" : ObjectId("569412e5a51a6656962af1c7"),
"result" : [
{
"id" : "j3847",
"value" : "water"
}
]
}
],
"ok" : 1
}
另一种选择是在单个步骤中使用和运算符,这样可以避免使用,这可能会对非常大的集合造成成本,并且在大多数情况下会导致16MB BSON限制:
db.docs.aggregate([
{
"$project": {
"result": {
"$setDifference": [
{
"$map": {
"input": "$result",
"as": "r",
"in": {
"$cond": [
{ "$eq": [ "$$r.id", "$list.blue" ] },
"$$r",
false
]
}
}
},
[false]
]
}
}
}
])
样本输出
{
"result" : [
{
"value" : "water"
}
],
"ok" : 1
}
{
"result" : [
{
"_id" : ObjectId("569412e5a51a6656962af1c7"),
"result" : [
{
"id" : "j3847",
"value" : "water"
}
]
}
],
"ok" : 1
}
您可以使用mongo聚合中的运算符执行此操作。它返回一个数组,其中只包含与条件匹配的元素:
db.docs.aggregate([
{
$project: {
result: {
$filter: {
input: "$result",
as:"item",
cond: { $eq: ["$list.blue", "$$item.id"]}
}
}
}
}
])
此查询的输出如下所示:
{
"_id" : ObjectId("569415c8299692ceedf86573"),
"result" : [ { "id" : "j3847", "value" : "water" } ]
}
您的查询是否遍历整个文档集合,或者我们是否可以使用文档id指定要“聚合”的文档?如果您希望通过
\u id
或任何其他键筛选聚合管道中的文档,可以使用管道操作符。这类似于MongoDB集合的find()
方法和SQL的WHERE
子句。基本上,这会过滤传递给下一个操作员的数据。管道中可以有多个$match
运算符。是否可以返回除与条件匹配的值以外的其他值?@samland是的,您可以使用以下语法向添加其他字段:field:1。或者,您可以使用将整个文档投影到字段。在投影中,它将如下所示:document:'ROOT'