MongoDB - ObjectId的聚合$match

5

我有一个类似于下面的架构:

var mongoose = require('mongoose');

module.exports = mongoose.model('Owner',{
    username: String,
    blocks: {type:mongoose.Schema.Types.ObjectId, ref: 'Block'},
});

我正在尝试运行一个查询,以查看Owner是否有对Block的id的引用。 Owner具有ObjectId数组。当我运行db.owners.aggregate({$match:{username:'example'}},{$unwind:“$ blocks”},{$project:{_id:1,blocks:1}})时,它返回:

{ "_id" : ObjectId("550d9dc64d9dc3d026fadfc7"), "blocks" : ObjectId("550dc117dc9605ab27070af7") }
{ "_id" : ObjectId("550d9dc64d9dc3d026fadfc7"), "blocks" : ObjectId("550dc123dc9605ab27070af8") }
{ "_id" : ObjectId("550d9dc64d9dc3d026fadfc7"), "blocks" : ObjectId("550dc12edc9605ab27070af9") }
{ "_id" : ObjectId("550d9dc64d9dc3d026fadfc7"), "blocks" : ObjectId("550dc157dc9605ab27070afa") }

我该如何匹配块id?我尝试过db.publishers.aggregate({$match:{username:'example'}}, {$unwind:“$blocks”},{$project:{_id:1,blocks:1}},{$match:{"blocks._id":'550dc157dc9605ab27070afa'}}),但是这似乎没有起作用。

2个回答

10

我认为你不需要聚合,可以使用简单的find()findOne()查询:

var Mongoose = require('mongoose');
var ObjectId = Mongoose.Types.ObjectId;

Owner.findOne({ username: 'example', blocks: new ObjectId('550dc157dc9605ab27070afa') }, function (err, owner) {
   ...
});

1
这也可以!但我必须使用.aggregation.find引用它,如ObjectId('550dc157dc9605ab27070afa')所示。在找到此链接https://github.com/LearnBoost/mongoose/issues/1399之后,我发现了这一点。不确定为什么我要使用聚合框架。我一直在使用它处理具有子文档的内容。 - jordan
1
不错!我原以为Mongoose足够聪明,当字段引用另一个模型时,可以自动将字符串转换为ObjectId,但看起来并非如此。我现在修改了代码,使用new ObjectId()来处理字符串。 - Gergo Erdosi
这对于你的使用场景是一个很好的替代方案,但它并没有明确回答在聚合操作中如何与ObjectId匹配的问题,如果有可能,这将非常有帮助。 - NoobSter
@jordan 非常感谢您提供那个链接 :) - ptrin

1

这目前不适用于版本> 3.8.31,我已经在这上面浪费了无数的时间,应该更早测试早期版本...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接