【问题标题】:Get limited data from $unwind mongodb从 $unwind mongodb 获取有限的数据
【发布时间】:2018-06-10 15:29:05
【问题描述】:

我有一个聊天集合,下面给出了

{
    "_id" : ObjectId("5a44e6545818041cde24aac9"),
    "messages" : [ 
        {
            "createdAt" : ISODate("2017-12-23T07:46:29.201Z"),
            "message" : "Hii",
            "userId" : "000000"
        }, 
        {
            "createdAt" : ISODate("2017-12-23T12:46:29.201Z"),
            "message" : "Bye gtg ttyl",
            "userId" : "111111"
        }, 
        {
            "createdAt" : ISODate("2017-12-24T07:46:29.201Z"),
            "message" : "Bye Take Care",
            "userId" : "000000"
        }
    ],
    "createdAt" : ISODate("2017-10-23T07:46:29.201Z"),
    "users" : [ 
        {
            "facebookId" : "000000",
            "unread" : 0
        }, 
        {
            "facebookId" : "111111",
            "unread" : 0
        }
    ]
}

当我在 nodejs 中执行以下查询时

chats.aggregate( [ { $unwind : "$messages" },{ $unwind : "$users" } ])

我得到一个类似这样的数组,其中 unwind 打开我的数组是这样的

[
    {
        "_id": "5a44e6545818041cde24aac9",
        "messages": {
            "createdAt": "2017-12-23T07:46:29.201Z",
            "message": "Hii",
            "userId": "000000"
        },
        "createdAt": "2017-10-23T07:46:29.201Z",
        "users": {
            "facebookId": "000000",
            "unread": 0
        }
    },
    {
        "_id": "5a44e6545818041cde24aac9",
        "messages": {
            "createdAt": "2017-12-23T07:46:29.201Z",
            "message": "Hii",
            "userId": "000000"
        },
        "createdAt": "2017-10-23T07:46:29.201Z",
        "users": {
            "facebookId": "111111",
            "unread": 0
        },
    }, //And so on.
] 

但是我只能在messages.userId !== users.facebookIdmessages.userId !== users.facebookId展开后获取对象

当我获取数据时,直接从 MongoDB 获取类似于以下对象的内容

[
    {
        "_id": "5a44e6545818041cde24aac9",
        "messages": {
            "createdAt": "2017-12-23T07:46:29.201Z",
            "message": "Hii",
            "userId": "000000"
        },
        "createdAt": "2017-10-23T07:46:29.201Z",
        "users": {
            "facebookId": "111111",
            "unread": 0
        },
    },{
        "_id": "5a44e6545818041cde24aac9",
        "messages": {
            "createdAt": "2017-12-23T12:46:29.201Z",
            "message": "Bye gtg ttyl",
            "userId": "111111"
        },
        "createdAt": "2017-10-23T07:46:29.201Z",
        "users": {
            "facebookId": "000000",
            "unread": 0
        }
    }, {
        "_id": "5a44e6545818041cde24aac9",
        "messages": {
            "createdAt": "2017-12-24T07:46:29.201Z",
            "message": "Bye Take Care",
            "userId": "000000"
        },
        "createdAt": "2017-10-23T07:46:29.201Z",
        "users": {
            "facebookId": "111111",
            "unread": 0
        }
    }
] 

【问题讨论】:

  • 试试{$match:{ 'messages.userId' :{ $ne: '$users.facebookId'} }])
  • @Veeram 它不工作
  • 我可以查看您的查询吗?
  • chats.aggregate( [ { $unwind : "$messages" },{ $unwind : "$users" },{$match:{ 'messages.userId' :{ $ne: '$ users.facebookId'}}}]).exec(function(err, data) { res.send(data); }); @Veeram

标签: node.js mongodb mongoose mongodb-query mongoose-populate


【解决方案1】:

试试下面一个

db.coll3.aggregate([{
            $unwind: '$users'
        }, {
            $project: {
                messages: 1,
                users: 1,
                'messages': {
                    $filter: {
                        input: '$messages',
                        as: 'item',
                        cond: {
                            $ne: ['$$item.userId', '$users.facebookId']
                        }
                    }
                }
            }
        },{ $unwind : "$messages" }
    ])

这是在 mongoshell 中。我注意到您记录中的零数量不相等。即使@veeram 和@Astro 的上述查询为您提供了正确的结果(如果您尝试过),请确保您不会与它们混淆

【讨论】:

    【解决方案2】:

    您可以包含$match 阶段以仅获取符合此条件的那些文档:

    db.chats.aggregate( [ { $unwind : "$messages" },{ $unwind : "$users" }, {$match:{ 'messages.userId' :{ $ne: 'users.facebookId'} }])
    

    【讨论】:

    • 这对至少看起来很奇怪:messages.messages: 111111 和 users.facebookId:111111
    • 为什么?你能解释一下吗?
    • 虽然找不到任何区别
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多