在单个内部属性上查找匹配的数组内容和长度

时间:2017-06-02 06:01:26

标签: javascript mongodb meteor

我正在尝试让查询正常工作,但是对于我的生活我却陷入困境。

  'chat.newDirect': function(otherUser) {
      CEChats.collection.find({
            $and: [
                { 
                    members:{
                    $elemMatch: {memberId: this.userId}
                }
            },
                { 
                    members:{
                    // $elemMatch: {memberId: otherUser._id}
                        $all: {
                            $elemMatch: {
                                memberId: otherUser.$._id
                            }
                        }
                    }
                }
            ]
        }).fetch();

最初,otherUser是一个单个对象,但现在它已被更改为一个对象数组。

我要做的是找到包含otherUser数组中所有ID的文档。

otherUser._id需要匹配members.memberId数组中的一个元素。

我还希望它只返回具有确切成员列表的文档,所以不要在这些文档之上添加额外内容,所以我还要添加一个长度检查来执行此操作。

〜编辑澄清
otherUser是传递给函数

的对象数组
[
    {_id: 1, fu:'fuu', bar:'baar'},
    {_id: 2, fu:'fuu', bar:'baar'},
    {_id: 3, fu:'fuu', bar:'baar'}
]

members是我正在比较的文档中的对象数组。

[
{members: [
    {_id: 1, baz:'fuu'},
    {_id: 2, baz:'fuu'},
    {_id: 3, baz:'fuu'},
    {_id: 4, baz:'fuu'},
    {_id: 5, baz:'fuu'}
]},
{members: [
    {_id: 1, baz:'fuu'},
    {_id: 2, baz:'fuu'},
    {_id: 3, baz:'fuu'}
]},
{members: [
    {_id: 1, baz:'fuu'}
]}
]

运行查询后,只返回第二个对象,因为它是唯一一个包含成员数组中对象中所有成员ID的对象

1 个答案:

答案 0 :(得分:1)

您需要转换源代码,然后使用$all$size传递查询:

var otherIds = [
  {_id: 1, fu:'fuu', bar:'baar'},
  {_id: 2, fu:'fuu', bar:'baar'},
  {_id: 3, fu:'fuu', bar:'baar'}
];

var ids = otherIds.map( oth => oth._id );

CEChats.collection.find({ 
    "members._id": { "$all": ids },
    "members": { "$size": ids.length } 
}).fetch()

返回第二个结果:

    "members" : [
            {
                    "_id" : 1,
                    "baz" : "fuu"
            },
            {
                    "_id" : 2,
                    "baz" : "fuu"
            },
            {
                    "_id" : 3,
                    "baz" : "fuu"
            }
    ]

因此,您首先使用.map()来提取_id值。然后,您可以使用"members._id"_id一起传入,只比较该数组内容的.length值。另一个约束是您可以从比较数组{{1}}属性获得的确切$all