gpt4 book ai didi

javascript - Mongodb 按 dbref 字段分组

转载 作者:可可西里 更新时间:2023-11-01 10:03:54 26 4
gpt4 key购买 nike

我需要按型号分组产品。每个产品都有模型字段 - DBRef 到模型集合。我尝试使用此聚合查询,但出现错误 FieldPath field names may not start with '$'.

聚合查询:

db.Products.aggregate([
{ $project: { _id: 0, model: 1, isActive: 1 } },
{ $group: { _id: "$model.$id", actives: { $push: "$isActive" } }}
]);

产品文档示例:

{
_id: ObjectId("54f48610e31701d2184dede5"),
isActive: true,
model: {
$db: "database",
$ref: "Models",
$id: ObjectId("....")
}
}

最佳答案

手册中曾经有一个部分明确指出聚合框架不支持 DBRef,以及其他各种 BSON 类型。

旧段落如本 google groups archive 所示阅读留言:

Warning: The pipeline cannot operate on values of the following types: Binary, Symbol, MinKey, MaxKey, DBRef, Code, and CodeWScope.

它可能还在某个地方,但我现在似乎找不到它:)

此外,在该消息线程中提到的是,除了聚合框架不支持这一点之外,您的另一个选择(也是唯一真正的聚合选项)是使用 mapReduce方法代替。作为一个 shell 示例:

db.Products.mapReduce(
function() {
emit( this.model.$id, { "actives": [this.isActive] } );
},
function(key,values) {
var result = { "actives": [] };
values.forEach(function(value) {
value.actives.forEach(function(active) {
result.actives.push( active );
});
});
},
{ "out": { "inline": 1 } }
)

由于 mapReduce 结果的任意 { "_id": "", "value": { } } 结构,它看起来不太好,但它确实允许您进行那种聚合正在寻找。

还有对这个 JIRA 问题的引用:SERVER-14466 ,但我不会在这方面坚持太多行动。

因此您可以使用 mapReduce,但建议不要使用 DBRef 并定义“手动引用”的替代形式,要么嵌入“集合”和“数据库”信息,要么依赖应用程序中此类事物的外部定义架构,具体取决于您的需要。只要您遵循相同的规则,您就可以将聚合框架用于任何具有有效属性名称的内容。

关于javascript - Mongodb 按 dbref 字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28836120/

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