从 $unwind mongodb 获取有限数据
Get limited data from $unwind mongodb
我有一个聊天记录集,如下所示
{
"_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.
]
但是我只能在 unwind where messages.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
阶段以仅获取符合此条件的结果文档:
db.chats.aggregate( [ { $unwind : "$messages" },{ $unwind : "$users" }, {$match:{ 'messages.userId' :{ $ne: 'users.facebookId'} }])
试试下面一个
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 的查询给了您正确的结果,如果您尝试了它们
我有一个聊天记录集,如下所示
{
"_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.
]
但是我只能在 unwind where messages.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
阶段以仅获取符合此条件的结果文档:
db.chats.aggregate( [ { $unwind : "$messages" },{ $unwind : "$users" }, {$match:{ 'messages.userId' :{ $ne: 'users.facebookId'} }])
试试下面一个
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 的查询给了您正确的结果,如果您尝试了它们