我有一个主收藏和一个参考一个主收藏。代码看起来如下:
// Ref schema
const onlineSchema = mongoose.Schema({
_id: {
type: Number,
ref: 'Player',
unique: true
}
}, {
timestamps: true
});
//main schema
const playerSchema = mongoose.Schema({
_id: { // User ID
type: Number,
required: true,
unique: true,
default: 0
},
firstname: {
type: String
},
name: {
type: String,
required: true
},
lastname: {
type: String
},
barfoo: {
type: Boolean
}
...
})我用以下代码填充它:
var baz = bar;
...
Online.find().populate({
path: '_id',
match: {
[ baz + 'foo']: true
}
}).exec(function(err, online) {
if (err) {
winston.error(err);
} else {
winston.error(util.inspect(online, {
showHidden: false,
depth: null
}));
}
});如果在线中有10个元素,并且只有7个匹配的[ baz + 'foo']: true,我会得到7个适当的数组和3个空数组,如下所示:
{ updatedAt: 2016-12-23T18:00:32.725Z,
createdAt: 2016-12-23T18:00:32.725Z,
_id: null,
__v: 0 },为什么会发生这种情况,以及如何过滤最终结果,使其只显示匹配的元素?
在得到结果之后,我可以使用过滤器删除空数组,但是我想知道如何防止查询首先传递空数组。
发布于 2016-12-24 02:52:43
为什么会发生这种事?
之所以会发生这种情况,是因为您使用Online.find()获得了所有文档,但是player将只填充与您的条件匹配的记录。您的match用于populate,而不是find()查询。
如何过滤最终结果,使其只显示匹配的元素?
您无法找到引用集合的嵌套元素,因为MongoDB中没有联接。但你可以:
$lookup中使用聚合:
Online.aggregate( { $lookup:{$lookup:{ from:"players",localField:"_id",foreignField:"_id",as:"players“} },{ $unwind:"$players”},{ $match:{ 'players.barfoo':true },函数(错误,结果){console.log(结果);});Player作为子文档:
const playerSchema =新mongoose.Schema({ //. });const onlineSchema =新mongoose.Schema({ player: playerSchema },{ timestamps: true });var Online = mongoose.model('Online',onlineSchema);发布于 2016-12-24 02:12:07
不要让_id成为另一个模式的reference,而是创建另一个field名称player并通过它给reference命名。
const onlineSchema = mongoose.Schema({
player: {
type: Number,
ref: 'Player',
unique: true
}
}, {
timestamps: true
});人口:
Online.find().populate({
path: 'player',
match: {
[ baz + 'foo']: true
}
}).exec(...);发布于 2016-12-25 10:56:01
不要使用_id作为参考字段。因为它的默认字段在mongoDB中创建索引唯一。更改你的字段名
https://stackoverflow.com/questions/41306358
复制相似问题