即使部分匹配为false,MongoDB也会获取记录

时间:2018-03-26 10:33:58

标签: mongodb

代理商表有很多代理商

如果每个代理商都是users.type:"代理商"

这一切都很好,但是......

如果代理商没有users.type:"代理商",那么我也没有得到代理商

我希望得到他们有没有用户的所有代理天气。

如果我删除此行

d2$MthDD <- format(as.Date(d2$PickUpDate), "%m-%d")

然后我得到所有用户的所有代理商,无论他们是什么类型,所以这很糟糕

如果我插入该行,我会让所有代理商都有代理类型用户,但我让所有无用户的代理商。

我希望有一种方法可以将// { $match: { 'users.type': 'agent' } }, 置于用户{ $match: { 'users.type': 'agent' } },

任何人都有一个可以帮助的解决方法吗?

$lookup

嗯...我可以在$ agencyTable.aggregate([ { $match: {} }, { $lookup: { from: "users", localField: "_id", foreignField: "agency", as: "users" } }, { $unwind: { path: "$users", preserveNullAndEmptyArrays: true } }, // { $match: { 'users.type': 'agent' } }, { $group: { "_id": "$_id", "phone": { "$first": "$phone" }, "website": { "$first": "$website" }, "address": { "$first": "$address" }, "googlemaps": { "$first": "$googlemaps" }, "rating": { "$first": "$rating" }, "activityDate": { "$first": "$activityDate" }, "users": { "$push": "$users" } } }, { $addFields: { "users": { "$map": { "input":"$users", "as":"usr", "in":{ "userID":"$$usr._id", "userName":"$$usr.name", "userPhone":"$$usr.phone" } } } } }, { $project: { "_id" : 1, "phone" : 1, "website" : 1, "address" : 1, "googlemaps" : 1, "rating" : 1, "activityDate" : 1, "users" : 1 } } ]) 中执行$match: { 'users.type': 'agent'吗?这可能吗?

addfields

这个不行(不幸的是),因为没有代理商&#39;输入用户。 有很多“租客”#39;类型使用,所以如果我用租户替换代理,它工作得很好。

如果我保留它,我根本就没有结果。 Hmmmm ..... 我不明白 - 在我看来这应该有效!

1 个答案:

答案 0 :(得分:1)

如果我的问题正确,您希望获得“代理”类型的用户和没有代理商的用户。

尝试将匹配查询更改为:

 { 
         $match: { 
                    $or: [

                            {
                                'users.type': 'agent'
                            },
                            {
                                "users": {$exists: false }
                            },

                        ]
             } 


      },