首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >猫鼬填充返回一些空对象。

猫鼬填充返回一些空对象。
EN

Stack Overflow用户
提问于 2016-12-23 18:38:31
回答 3查看 1.1K关注 0票数 1

我有一个主收藏和一个参考一个主收藏。代码看起来如下:

代码语言:javascript
运行
复制
// 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
}
...

})

我用以下代码填充它:

代码语言:javascript
运行
复制
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个空数组,如下所示:

代码语言:javascript
运行
复制
    { updatedAt: 2016-12-23T18:00:32.725Z,
createdAt: 2016-12-23T18:00:32.725Z,
_id: null,
 __v: 0 },

为什么会发生这种情况,以及如何过滤最终结果,使其只显示匹配的元素?

在得到结果之后,我可以使用过滤器删除空数组,但是我想知道如何防止查询首先传递空数组。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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);
票数 2
EN

Stack Overflow用户

发布于 2016-12-24 02:12:07

不要让_id成为另一个模式的reference,而是创建另一个field名称player并通过它给reference命名。

代码语言:javascript
运行
复制
const onlineSchema = mongoose.Schema({
    player: {
        type: Number,
        ref: 'Player',
        unique: true
    }
}, {
    timestamps: true
});

人口:

代码语言:javascript
运行
复制
Online.find().populate({
    path: 'player',
    match: {
        [ baz + 'foo']: true
    }
}).exec(...);
票数 0
EN

Stack Overflow用户

发布于 2016-12-25 10:56:01

不要使用_id作为参考字段。因为它的默认字段在mongoDB中创建索引唯一。更改你的字段名

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41306358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档