MongoDB-ObjectId上的聚合$match

MongoDB-ObjectId上的聚合$match,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有一个如下所示的模式: var mongoose = require('mongoose'); module.exports = mongoose.model('Owner',{ username: String, blocks: {type:mongoose.Schema.Types.ObjectId, ref: 'Block'}, }); 我正在尝试运行一个查询,以查看所有者是否有对块id的引用。所有者有一个ObjectID数组。当我运行db.owners.aggreg

我有一个如下所示的模式:

var mongoose = require('mongoose');

module.exports = mongoose.model('Owner',{
    username: String,
    blocks: {type:mongoose.Schema.Types.ObjectId, ref: 'Block'},
});
我正在尝试运行一个查询,以查看所有者是否有对块id的引用。所有者有一个ObjectID数组。当我运行
db.owners.aggregate({$match:{username:'example'},{$unwind:$blocks},{$project:{{u 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'},{$undwind:$blocks},{$project:{{u id:1,blocks:1},{$match:{“blocks.\u id:'550dc157dc9605ab27070afa'}})
但这不起作用。

我认为你不需要为此进行aggregation,你可以使用一个简单的
find()
查询:

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

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

这在版本>3.8.31的情况下现在不起作用
我在这件事上浪费了无数个小时,应该早点测试市长…

这也行!但我必须将它(包括
.aggregation
.find
)引用为ObjectId('550dc157dc9605ab27070afa')。我发现在找到这个链接之后。不知道我为什么使用聚合框架。我在一些有子文档的东西上用过它。很好!我认为Mongoose足够聪明,可以在字段引用其他模型时自动将字符串转换为ObjectId,但看起来不是这样。我现在修改了代码,在字符串上使用
new ObjectId()
。这对于您的用例来说是一个很好的选择,但它并没有明确回答在聚合中与ObjectId匹配的问题,如果可能的话,这将非常有帮助。@jordan非常感谢提供该链接:)