Вывести данные из коллекции по массиву

Рейтинг: 1Ответов: 1Опубликовано: 19.09.2014

Есть.

/* 0 */
{
    "_id" : ObjectId("541c03489c3009e80de19d6b"),
    "ts" : 1411121993,
    "close" : false,
    "users" : [ 
        "7e8f5f8fc847bc6", 
        "920299d58dc02ec"
    ],
    "__v" : 0
}

/* 1 */
{
    "_id" : ObjectId("541c035f9c3009e80de19d6c"),
    "ts" : 1411122016,
    "close" : false,
    "users" : [ 
        "7e8f5f8fc847bc6", 
        "a285496ba35fe98"
    ],
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("541c035f9c3009e80de19d6d"),
    "ts" : 1411122016,
    "close" : false,
    "users" : [ 
        "7e8f5f8fc847bc6", 
        "c2f1f4e949237d1"
    ],
    "__v" : 0
}

Это коллекция диалогов.

Допустим, мой id - 7e8f5f8fc847bc6.

Мне нужно создать новый диалог с пользователем id - c2f1f4e949237d1.

Для этого мне нужно проверить на существование такого диалога.

Если он уже существует и close: false, то нужно выдать его dialog id, если нет - создать новый.

Проблема в том, что я не пойму, как в mongoose сделать запрос проверки.

В массиве users данные могут быть в любом порядке, но их не может быть больше двух.

На языке sql это примерно вот так:

select ... where (users = ['c2f1f4e949237d1', '7e8f5f8fc847bc6'] or users = ['7e8f5f8fc847bc6', 'c2f1f4e949237d1']) and close = false

Ответы

▲ 1Принят
> db.dialogs.find();
{ "_id" : ObjectId("541c03489c3009e80de19d6b"), "ts" : 1411121993, "close" : false, "users" : [ "7e8f5f8fc847bc6", "920299d58dc02ec" ], "__v" : 0 }
>
> db.dialogs.find({users:"7e8f5f8fc847bc6", users:"920299d58dc02ec", close:false});
{ "_id" : ObjectId("541c03489c3009e80de19d6b"), "ts" : 1411121993, "close" : false, "users" : [ "7e8f5f8fc847bc6", "920299d58dc02ec" ], "__v" : 0 }
>
>
> db.dialogs.find({users:"7e8f5f8fc847bc6", users:"920299d58dc02ec", close:false},{_id:1});
{ "_id" : ObjectId("541c03489c3009e80de19d6b") }
>

Upd2:

db.dialogs.find(
    {$and:[
        {users:"7e8f5f8fc847bc6hghg"}, 
        {users:"920299d58dc02ec"}, 
        {close:false}
    ]},
    {_id:1}
);